Esempi e stili di programmazione

Successione di Fibonacci
F(0)=F(1)=1
F(n)=F(n-1)+F(n-2)

Spunti da MCmicrocomputer n.140, maggio 1994 (rev. dicembre 2002)

Programmazione imperativa

fib1[n_] := 
      Module[{uno, due, temp, i}, 
uno = 1; 
          due = 1; 
For[i = 1, 
            i < n, i++, 
temp = 
              uno; 
uno = 
              temp + due; 
due = 
              temp]; 
uno] /; IntegerQ[n]

IntegerQ[2.1]

fib1[20]

fib2[n_] := 
      Module[{uno = 1, 
            due = 1}, 
Do[{uno, due} = {uno + due, 
                uno}, {n - 1}]; 
uno] /; 
        IntegerQ[n]

fib2[20]

Programmazione alla LISP

fib3[n_ /; IntegerQ[n]] := 
        If[n < 2, 1, fib3[n - 1] + fib3[n - 2]];

fib3[20]

Programmazione dichiarativa simile al Prolog

fib4[0] = 1;
fib4[1] = 1;
fib4[n_Integer] = fib4[n - 1] + fib4[n - 2];

g[n_Integer] := n

g[2]

g[2.2]

fib4[20]

. . .   con memoria

a = b = 1 + 1;
a

fib5[0] = 1;
fib5[1] = 1;
fib5[n_Integer] := fib5[n] = 
          fib5[n - 1] + fib5[n - 2];

fib5[3]

?fib5

fib5[20]

fib5[19]

Un esempio di programmazione funzionale

fibStep[{a_, b_}] := {a + b, a}

?Nest

Nest[fun, x, 3]

Nest[fibStep, {1, 1}, 
        3][[1]]

fib6[
        n_Integer /; n > 0] := Nest[fibStep, {1, 1}, 
          n - 1][[1]]

fib6[20]