「フィボナッチ数/Python」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「Pythonフィボナッチ数(fibonacci)の記述例。 == 記述例1 == PythonではPython 2.4から導入されたデコレーターを用いて...」)
 
imported>Fallout New Tokyo
5行目: 5行目:
 
なお、同じくものを[[クラス]]ではなく[[クロージャー]]で書き直した人もいる<ref>http://d.hatena.ne.jp/tanihito/20110119/1295459297</ref>。
 
なお、同じくものを[[クラス]]ではなく[[クロージャー]]で書き直した人もいる<ref>http://d.hatena.ne.jp/tanihito/20110119/1295459297</ref>。
  
これらを用いた記述例は以下のようになる。[[末尾呼び出し最適化]]を用いない場合には「@tail_recursive 」の記述を消せばよい。その場合は[[エントリーポイント]]内の[[ループ変数]]「x」が大きいと[[スタックオーバーフロー]]を起こすと思う。
+
これらを用いた記述例は以下のようになる。[[末尾呼び出し最適化]]を用いない場合には「@tail_recursive 」の記述を消せばよい。その場合は[[エントリポイント]]内の[[ループ変数]]「x」が大きいと[[スタックオーバーフロー]]を起こすと思う。
  
 
<source lang="python">
 
<source lang="python">

2014年2月27日 (木) 02:42時点における版

Pythonフィボナッチ数(fibonacci)の記述例。

記述例1

PythonではPython 2.4から導入されたデコレーターを用いてメタプログラミングを実現した人がおり[1]、それを使えば関数の頭に「@tail_recursive」と書くことで末尾再帰最適化を明示することができる。 なお、同じくものをクラスではなくクロージャーで書き直した人もいる[2]

これらを用いた記述例は以下のようになる。末尾呼び出し最適化を用いない場合には「@tail_recursive 」の記述を消せばよい。その場合はエントリポイント内のループ変数「x」が大きいとスタックオーバーフローを起こすと思う。

def fib(n):
    @tail_recursive
    def fib_iter(a, b, m):
        return a if m == 0 else fib_iter(b, a + b, m - 1)
    return fib_iter(0, 1, n)

if __name__ == "__main__":
    for x in range(1, 100):
        print fib(x),

関連項目

参考文献

外部リンク