これは、コンピューターがそれを行う方法について考えることが役立つときの 1 つです。
関数から始めましょう。LANGUAGE のことを少し考えないようにしてほしいので、Python 風味の疑似コードで記述します。
def fib(n):
if n == 0: return 0
if n == 1: return 1
if n > 1: return fib(n-2) + fib(n-1)
それでは、fib(2) について説明しましょう。
fib(2)
n>1であるため、3 番目のブランチを使用します。
return fib(2-2) + fib(2-1)
したがって、0 でfib()を呼び出します。これは 0 です。
return 0 + fib(2-1)
fib()を 1 で呼び出します
return 0 + 1
結果 1 が表示されます。次に、fib(3) を考えます。
n>1 なので
return fib(3-2)+fib(3-1)
3-2 は 1 であるため、最初の項の fib(1) が得られます。これは 1 です。
return 1 + fib(3-1)
そして今、fib(3-1)、つまり fib(2) を呼び出すとき、まだ直接的な答えはありません。n>1。だからそれはなる
return 1 +
return fib(2-2) + fib(2-1)
なる
return 0 + 1
前の呼び出しに戻ります。
return 1 + 1
値 2 を取得します。つまり、独立したスレッドはなく、式全体で機能するだけです。fib(4) の例を作成するための演習として残しておきます。でも、もしそうなら、あなたはそれを釘付けにするでしょう。
簡単なクイズ:反復バージョンの方が劇的に効率的である理由は何ですか?