\ Fibonacci-Zahlen
\ Swift-Forth
\ Wolfgang.Urban@schule.at

\ Algorithmus 1

: fibo1 ( n -- fibo_n )
    dup                        \ n -- n n
    2 <= if                \ n <= 2 ?
      drop                \ n  --
      1                        \ 1 ist Ergebnis
    else
      dup 1 -                 \ n -- n n-1
      recurse                \ n f_n-1
      swap 2 -                 \ n f_n-1 -- f_n-1 n -- f_n-1 n-2
      recurse                \ f_n-1 f_n-2
      +                        \ f_n   
    then
;

\ Algorithmus 1a im
\ kompakten Forth Schreibstil. Details siehe oben.

: fibo1a ( n -- fibo_n )
    dup 2 <= if drop 1 exit then
    dup 1 - recurse swap 2 - recurse +                        
;

\ Algorithmus 3

: fibo3 ( n -- fibo_n )
    dup
    2 <= if                 \ wenn n<=2
       drop 1 exit
    then         

    1 1                        \ erste 2 Werte
    rot                        \ n raufholen
    2 -                 \ n-2 Iterationen
    0                        \ Ende mit 0
    ?do                        \ Schleifenstart
       dup rot                \ a b -- a b b  -- b a b
       +                \ b a+b
    loop                \ Schleifenende
    nip                        \ a b -- b
;

\ Algorithmus 4
\ mit aufrufendem Wort 'fibo'

: fibo4 ( a b n -- lucas_n )
    dup                        \ -- a b n n
    1 = if                \ -- a b n
       drop drop        \ -- a
       exit
    then
    dup                        \ -- a b n n
    2 = if                \ -- a b n
       drop nip                \ -- b
       exit
    then

    rot                 \ b n a
    rot                 \ n a b
    dup                        \ n a b b
    rot                        \ n b b a
    +                        \ n b a+b
    rot                        \ b a+b n
    1 -                        \ b a+b n-1
    recurse
;

: fibo ( n -- fibo_n ) 1 1 rot fibo4 ;

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

\ Aufruf: z.B.  1 1 10 fibo4 .
\         oder  10 fibo .