試しにベースのソリューションですこれは:
def recFib(n):
if n == 1:
return [0]
elif n == 2:
return [0, 1]
else:
a = recFib(n-1)
return a + [a[-1] + a[-2]]
プログラム内のキーはここにある:ここで
return a + [a[-1] + b[-1]]
a # This gets the most recently created list, since it's `recFib(n-1)`
+ # Append to the next list (but does not return `None`)
[ a[-1] # Last value of `recFib(n-1)`, which is the previous value.
+ # Add to
a[-2]] # Second last value of `recFib(n-1)`, which is the second previous value.
はrecFib(5)
のためのブレークポイントです:
n = 3
a[-1]: 1
a[-2]: 0
n = 4
a[-1]: 1
a[-2]: 1
n = 5
a[-1]: 2
a[-2]: 1
[0, 1, 1, 2, 3]
それは2つの機能を必要としません。私は一種の不正行為としてそれを見つける:
再帰関数をループすることは非常に非効率的であるためのリストを生成
>>> recFib(20)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
>>> recFib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> recFib(19)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]
。関数を使用するたびにシーケンス全体を再計算します。
値は結果に追加されるとしますか?それはあなたが別のリスト "古い"に追加しているようだ、または何かが欠けている。 – BigMonkey89WithaLeg
私はお詫び申し上げます。私はそれを修正しました –