斐波那契的表现

Jon*_*Jon 6 performance wolfram-mathematica fibonacci

f[0] = 0;
f[1] = 1;
f[x_] := f[x-1] + f[x-2]
Run Code Online (Sandbox Code Playgroud)

这个功能在Mathematica中运行缓慢,我需要提高速度.我必须使用函数式编程和递归.我不确定为什么这么慢,甚至最轻微的想法如何改善这将是有帮助的.

Cas*_*bel 9

编写更快的递归函数的好方法是让它记住以前的值.当然,这确实以内存为代价,但在这种情况下它可以提供帮助.为了计算f[x],你计算f[x-1]f[x-2]- 然后计算f[x-1],你f[x-2]再次计算; 你最终会重新计算很多价值.(原谅我的不精确!)

要随时存储东西,你可以使用这个成语:

f[x_] := ( f[x] = (* calculation of f[x] goes here *)  )
Run Code Online (Sandbox Code Playgroud)

编辑:我在这台机器上没有mathematica,但我很确定这不会计算出错误的值.

f[0] = 0;
f[1] = 1;
f[x_] := ( f[x] = f[x-1] + f[x-2] );

f[256]
Run Code Online (Sandbox Code Playgroud)

就像我在下面的评论中所说,如果你有其他的定义f,你可能想先用它们擦除它们Clear[f].

感谢rcollyer:小心$RecursionLimit!它默认为256.(当然,这是有充分理由的.真的很深的递归通常是一个坏主意.)