fun fib1(n) = if n <= 1 then 1 else fib1(n-1) + fib1(n-2); fib1(6); (* val it = 13 : int *) fun fib2(n) = if n <= 1 then (1,1) else let val (x,y) = fib2(n-1) in (x+y,x) end; fib2(6); (* val it = (13,8) : int * int *) fun fib3(n,(x,y)) = if n <= 1 then (1,1) else fib3(n-1,(x+y,x)); fib3(6,(1,1)); (* OOPS val it = (1,1) : int * int WHY? *) fun fib4(n,(x,y)) = if n <= 1 then (x,y) else fib4(n-1,(x+y,x)); fib4(6,(1,1)); (* val it = (13,8) : int * int *) fun nl() = print("\n"); fun tab() = print("\t"); fun pi(n) = print(Int.toString(n)); fun pp(x,y) = (print("(");pi(x);print(",");pi(y);print(")")); fun pt(n,p) = (nl();pi(n);tab();pp(p);nl()); fun fib5(n,(x,y)) = (pt(n,(x,y)); if n <= 1 then (x,y) else fib5(n-1,(x+y,x))); fib5(6,(1,1)); (* 6 (1,1) 5 (2,1) 4 (3,2) 3 (5,3) 2 (8,5) 1 (13,8) *)