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

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

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

[amazonjs asin=”B009Z30HPG” locale=”JP” title=”Dive Into Python 3 日本語版”]

ベーシックスタイル

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

[shell title=”フィボナッチ数列のベーシックスタイル”] 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] [/shell]

 

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

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

[shell title=”再帰を使ったフィボナッチ数列の求め方”] 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] [/shell]

 

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

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

[shell title=”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] [/shell]

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

 

Related posts

One Thought to “Python3 フィボナッチ数列の色々(再帰・yield)”

  1. […] [3] Python3 フィボナッチ数列の色々(再帰・yield)-from umentu import stupid […]

コメントを残す