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

此函数在 Mathematica 中运行缓慢,我需要提高速度。我必须使用函数式编程和递归。我不确定为什么运行如此缓慢,即使有丝毫想法也可以有所帮助。

最佳答案

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

要随时存储东西,您可以使用以下习语:

f[x_] := ( f[x] = (* calculation of f[x] goes here *)  )

编辑:我在这台机器上没有 mathematica,但我很确定这不会计算出错误的值。
f[0] = 0;
f[1] = 1;
f[x_] := ( f[x] = f[x-1] + f[x-2] );

f[256]

就像我在下面的评论中所说的那样,如果您对 f 有其他定义,您可能想先用 Clear[f] 将它们清除。

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

关于斐波那契的表现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4130161/

10-11 13:10