「再帰関数と非再帰関数」,「事象が連続発生するまでの試行回数」にも出てきたトリボナッチ数列だが,
「n 階段があるとき,1段昇る,2段昇る,3段昇るのどれかを選択して昇るとき何通りの昇り方があるか」という設問がされることもある。
よく,「アルゴリズムをわかりやすく表現できる再帰プログラム」の例としても出てくるのが以下のプログラム。フィボナッチ数列の拡張ということだ。
def step(n):
if n == 0:
return 1
if n < 0:
return 0
return step(n-1) + step(n-2) + step(n-3)
でも,これは相当スタックも喰うし,実行時間も馬鹿にならない。
import time
s = time.time()
for i in range(30):
print(i, step(i))
print(time.time()-s)
30 項計算するのに 46秒も掛かる。
これを再帰ではないプログラムにすると,(これもフィボナッチ数列の非再帰的求め方のプログラムだが)
s = time.time()
a, b, c, = 1, 1, 2
for i in range(3, 30):
a , b, c = b, c, a + b + c
print(i, c)
print(time.time()-s)
当たり前だが,わずか 0.0018 秒で終わる。