「フィボナッチ数/Python」の版間の差分
< フィボナッチ数
ナビゲーションに移動
検索に移動
imported>Fallout New Tokyo |
imported>Administrator |
||
2行目: | 2行目: | ||
== 記述例1 == | == 記述例1 == | ||
− | [[Python]]ではPython 2.4から導入された[[デコレーター]]を用いて[[メタプログラミング]]を実現した人がおり<ref>http://d.hatena.ne.jp/wasabiz/20110118/1295335821</ref>、それを使えば[[関数]]の頭に「@ | + | [[Python]]ではPython 2.4から導入された[[デコレーター]]を用いて[[メタプログラミング]]を実現した人がおり<ref>http://d.hatena.ne.jp/wasabiz/20110118/1295335821</ref>、それを使えば[[関数]]の頭に「@tail_recursive」と書くことで[[末尾再帰最適化]]を明示することができる。 |
なお、同じくものを[[クラス]]ではなく[[クロージャー]]で書き直した人もいる<ref>http://d.hatena.ne.jp/tanihito/20110119/1295459297</ref>。 | なお、同じくものを[[クラス]]ではなく[[クロージャー]]で書き直した人もいる<ref>http://d.hatena.ne.jp/tanihito/20110119/1295459297</ref>。 | ||
2014年8月6日 (水) 13:05時点における最新版
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),