なぜフィボナッチの再帰的手順がこれほど長く機能するのですか?
これはOCamlにあります:
let rec fib n = if n<2 then n else fib (n-1) + fib (n-2);;
これはMathematicaにあります:
Fib[n_] := If[n < 2, n, Fib[n - 1] + Fib[n - 2]]
これはJavaです:
public static BigInteger fib(long n) {
if( n < 2 ) {
return BigInteger.valueOf(n);
}
else {
return fib(n-1).add(fib(n-2));
}
}
それは長い間機能するからです。なぜなら、それは時間内にノードをn=100
持つツリーをトレースするからだと思います。2^100
ただし、生成する数値は100しかないため、100のメモリレジスタと100の計算タクトを消費する可能性があります。
したがって、実行を最適化することができます。
このタスクは何についてであり、どのように解決されますか?ソリューションはMathematicaに実装されていないので、おそらく存在しません。この問題に関する研究はどうですか?