Python3 フィボナッチ数列の色々(再帰・yield)

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

3種類のフィボナッチ数列を生成する関数を作ってみた。
まだyieldが手になじまないために。

ベーシックスタイル

最もベーシックなフィボナッチ数列の形。

In [1]: def fib(m):
   ...:         result = []
   ...:         a = 1
   ...:         b = 1
   ...:         while a < m:
   ...:                 result.append(a)
   ...:                 a, b = b, a+b
   ...:         return result
   ...:

In [2]: print(fib(1000))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

 

再帰を使ったフィボナッチ数列

これももはやベーシック?
でも関数としては使いづらい。

In [1]: def fib(n):
   ...:         if n <= 2:
   ...:                 return 1
   ...:         else:
   ...:                 return fib(n-1) + fib(n-2)
   ...:

In [2]: result = []

In [3]: for n in range(1,20):
   ...:         result.append(fib(n))
   ...:

In [4]: print(result)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

 

yieldを使ったフィボナッチ数列の求め方(推奨)

これが一番スマート。メモリ使用率の節約にもなる。

In [1]: def fib(m):
   ...:         a = 1
   ...:         b = 1
   ...:         while a < m:
   ...:                 yield a
   ...:                 a, b = b, a + b
   ...:

In [2]: f = fib(1000)

In [3]: list(f)
Out[3]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

yieldがもっとスマートに使えるようになれればいいなぁ。
 
Python3 フィボナッチ数列の色々2(イテレータ) に続く。

 

Follow me!

Python3 フィボナッチ数列の色々(再帰・yield)” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です