ジェネレータを用いたフィボナッチ数生成関数を走らせてみました。
処理速度は反復法に及びませんでしたが、なかなか面白い手法です。
import time,datetime
def generator(): # ジェネレータ
a, b = 0, 1
while True:
yield b
a, b = b, a + b
def fib_generator(n): # ジェネレータを用いた関数
fib = generator()
fib_list = [next(fib) for i in range(n-1)]
return fib_list[-1]
def fib_iterate(n): # 反復法
a, b = 0, 1
if n == 1:
return a
elif n == 2:
return b
else:
for i in range(n-2):
a, b = b, a + b
return b
def fib_recursion(n, memo={}): # メモ化再帰法
if n == 1:
return 0
elif n == 2:
return 1
elif n in memo:
return memo[n]
else:
memo[n] = fib_recursion(n-1, memo) + fib_recursion(n-2, memo)
return memo[n]
if __name__ == '__main__':
list_time = list()
for function in [fib_generator,fib_iterate,fib_recursion]:
start = time.time()
print(function)
print(function(41))
# 処理時間算出
process_time = time.time() - start
td = datetime.timedelta(seconds = process_time)
list_time.append(td.microseconds)
print(list_time)
--------------------------------------------------
出力
--------------------------------------------------
<function fib_generator at 0x1074070d0>
102334155
<function fib_iterate at 0x107407160>
102334155
<function fib_recursion at 0x107407040>
102334155
[52, 10, 33]