Rubyあるプログラムを書いていて、再帰がいわゆる「スタックオーバーフロー」するのに悩まされました。結局そのプログラムはカスだったのですが、スタックオーバーフローをおもしろい方法で回避することを知ったので、メモしておきます。単純に足すプログラムを、再帰で書きます。#=>5050こんな感じですね。これは再帰の呼び出しがメソッドの最後にあるので、「末尾再帰」といいます。これは引数を大きくすると、スタックオーバーフローを引き起こします。(SystemStackError)これを回避するのに、再帰呼出しの部分を関数を返すようにします。その関数を繰り返し呼び出すメソッドを追加します。#=>500000500000確かに、スタックオーバーフローは起きていません。手続きオブジェクト(クロージャ。ここなどを参照)であり、評価が「遅延」されるからです(「遅延評価」といいます)。動的な型付けが巧妙に使われています。これはおもしろい回避法ではないでしょうか。以上の元ネタは下の記事です。www.geocities.jpこの記事には他にも様々なことが書かれているので、勉強になりました。次のような方法もあります。#=>500000500000トップレベルのメソッドには適用できませんが、元のメソッドを変更なしで使える、スマートな方法です。元ネタはathos.hatenablog.comです。ここで多少アレンジされたコードを使いました。これはよく考えられた複雑な方法で、ここでも一種の「遅延評価」が実装されています。末尾呼び出し最適化をサポートしていました。if文を実装しましょう。問題」を解いてみました。これはスタックオーバーフローします。(21)月別アーカイブ参加グループRubyはてなブログをはじめよう!obelisk2さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。