使用While和Module命令的Mathematica,Fibonacci序列

时间:2011-04-02 06:21:50

标签: wolfram-mathematica while-loop

我如何编写一个计算f [n]的程序(对于Fibonacci数:f [n] = f [n] -f [n-2],其中f [0] =任意数字)使用ModuleWhile循环

3 个答案:

答案 0 :(得分:2)

作业?我希望你通过实例学习。 ; - )

您的主题行说的是递归,但您没有在您的问题中指明;相反,您指定ModuleWhile。我会选择后者。

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}