我一直在玩wolfram语言,并注意到一些东西:用不同的方式编写的相同函数在时间上的工作方式非常不同。为什么用不同的方式编写相同的函数有不同的结果时间?
考虑这两个功能:
NthFibonacci[num_] :=
If [num == 0 || num == 1, Return[ 1],
Return[NthFibonacci[num - 1] + NthFibonacci[num - 2]]
]
Fibn[num_] := {
a = 1;
b = 1;
For[i = 0, i < num - 1, i++,
c = a + b;
a = b;
b = c;
];
Return [b];
}
NthFibonacci[30]
需要大约5秒钟来评价。
Fibn[900 000]
也需要大约5秒来评估。
因此,内置的Fibonacci[50 000 000]
我根本无法得到为什么这三个之间的速度差异。理论上,递归应该或多或少等同于for循环。这是什么造成的?
“理论上,递归应该或多或少地等于for循环”:这通常不是真的,只适用于尾递归变换的特殊情况由编译器在迭代中。 – Renzo