メインメニューを開く

差分

末尾再帰最適化

138 バイト追加, 2012年5月30日 (水) 05:37
編集の要約なし
[[末尾呼び出し最適化]]([[Tail Call Optimization]]、[[TCO]])の一種で、[[再帰]]だとその効果が絶大だという話であり、やっていることは同じである。
[[末尾再帰]]([[末尾呼び出し]])であれば後に続く処理はないので、途中経過を保持する)であれば後に続く処理はないので、その関数内で使われている変数などは破棄でき(末尾呼び出しされる関数の引数は除く)、途中経過を保持する[[変数]]と、を用意することで、[[プログラマー]]が手で書くとボロクソに言われる[[goto文]]や[[アセンブリ言語]]のjmp命令などを用いて、のjmp命令などを用いて[[再帰]]を無くす(展開する)ことができる。
末尾再帰最適化はこの[[末尾再帰]]([[末尾呼び出し]])の特性を利用し、[[再帰]](関数呼び出し)は[[リソース]]馬鹿食いで[[スタックオーバーフロー]]の危険性があり、何よりクソ重い、かといって[[プログラマー]]が手動で[[再帰]](関数)を展開しておくと9割方[[ソースコード]]がクソ読みにくくなり、偉いプログラマーにボロクソ言われる、という問題を[[ソースコード]]の書き方を気を付けておくことで[[コンパイラ]]が[[最適化]]時に半自動で解決してくれる優れものである。
=== Python ===
[[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>。
[[階乗]](factorial)の記述例。
匿名利用者