我如何编写一个计算f [n]的程序(对于Fibonacci数:f [n] = f [n] -f [n-2],其中f [0] =任意数字)使用Module
和While
循环?
答案 0 :(得分:2)
作业?我希望你通过实例学习。 ; - )
您的主题行说的是递归,但您没有在您的问题中指明;相反,您指定Module
和While
。我会选择后者。
fib[n_] :=
Module[{x = 1, y = 0, i = 0},
While[i++ < n, {x, y} = {y, x + y}];
y
]
Array[fib, 7]
(* Out[]= {1, 1, 2, 3, 5, 8, 13} *)
Table[fib[m], {m, 1,10}]
(* Out[]= {1, 1, 2, 3, 5, 8, 13, 21, 34, 55} *)
答案 1 :(得分:2)
如果您试图给教师留下深刻印象,我会使用内存缓存方法。它明显快于Sjoerd描述的方法。
考虑这个实现
fib[0]:=1
fib[1]:=1
fib[n_]:= (fib[n]=fib[n-1]+fib[n-2])
让我们比较两者,只是为了证明我的观点。
slowfib[0]:=1
slowfib[1]:=1
slowfib[n_]:=slowfib[n-1]+slowfib[n-2]
以下是运行时的比较:
Map[fib, Range[30]] // AbsoluteTiming
{0.000158, {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025,
121393, 196418, 317811, 514229, 832040, 1346269}}
Map[slowfib, Range[30]] // AbsoluteTiming
{6.582185, {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025,
121393, 196418, 317811, 514229, 832040, 1346269}}
由于递归函数
,运行时间要高得多fib[n_]:=fib[n-1]+fib[n-2]
生成n ^ 2个递归调用(如果没有意义的话,将其写在纸上)。另一方面,定义
fib[n_]:= fib[n]=fib[n-1]+fib[n-2]
利用内存缓存来计算术语,从而大大加快运行时间,因为每次调用都会为fib [x]生成一个缓存值。
答案 2 :(得分:1)
按照标题的第一部分,以下方法将是如何做到这一点的一个例子:
fib[1] = 1;
fib[2] = 1;
fib[n_] := fib[n - 1] + fib[n - 2]
fib[3]
fib[7]
Out[11]= 2
Out[12]= 13
fib /@ Range[20]
Out[10]= {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,
610, 987, 1597, 2584, 4181, 6765}