それが第3章だけの場合は、著者が動的プログラミングをカバーしていたのではないかと思いますが、forループを使用して nth フィボナッチ数、 Fn。
定義を思い出してください、
Fn=⎧⎩⎨01Fn−1+Fn−2n=0n=1otherwise
Pythonで定義されている再帰関数を使用して、これを単純に計算できます。
def fib(n):
if n < 2:
return n
else:
return fib(n - 1) + fib(n - 2)
ただし、同じ副問題を何度も再計算することにより、この関数は計算に指数時間を必要とします(下図を参照)。
ただし、修正はあります。動的プログラミングを使用して「よりスマートな」再帰を実行し、以前の結果を維持できます。この方法では、再計算する必要はありませんFi。関数呼び出し「ツリー」はリストに折りたたまれ、計算されますFn 「ボトムアップ」から。
def fib2(n):
if n < 2:
return n
else:
if not results[n]:
results[n] = fib2(n - 1) + fib2(n - 2)
return results[n]
今私たちは持っています O(n) 計算する時間アルゴリズム Fn、しかし気づいたら、 O(n) 追加スペース(アレイごとに1つのスポット) Fi)。これを削減することができますO(1) それぞれのために追加のスペース Fi 他の2つのフィボナッチ数のみが必要です。 Fi−1 そして Fi−2。
def fib3(n):
if n < 2:
return n
f_0 = 0
f_1 = 1
f_n = 0
for _ in range(n - 1):
f_n = f_0 + f_1
f_0 = f_1
f_1 = f_n
return f_n