ホーム ›
エラー解決 › Ruby › stack level too deep
Ruby ERROR
Ruby SystemStackError: stack level too deep の原因と解決法
メソッドが自分自身を無限に呼び続けたときに発生するエラーです。再帰の終了条件の抜けや、意図しない自己呼び出しが原因です。
このエラーメッセージ
SystemStackError: stack level too deep
原因
- 再帰メソッドに終了条件(ベースケース)がない
- 終了条件が永遠に満たされない(値が減っていない等)
- ゲッターメソッド内で自分自身を呼んでいる(method内でself.methodなど)
❌ エラーになるコード
NG
def countdown(n)
puts n
countdown(n - 1) # 止まる条件がない
end
countdown(3)
✅ 修正したコード
OK
def countdown(n)
return if n < 0 # 終了条件
puts n
countdown(n - 1)
end
countdown(3)
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。
解決のポイント
再帰メソッドには必ず終了条件を先頭に書きます(return if n < 0)。「毎回の呼び出しで終了条件に近づいているか」も確認しましょう。深い再帰が必要な処理はwhileやeachのループに書き換えるとスタックを消費しません。
よくある質問
再帰を書いていないのに出るのはなぜ?
attr_writerを定義せず def name=(v); self.name = v; end のように書くと自分自身を呼ぶ無限ループになります。@name = v のようにインスタンス変数へ代入してください。
メモ化や末尾再帰で回避できる?
メモ化は同じ計算の繰り返しには有効です。Rubyは末尾再帰最適化がデフォルト無効のため、深い再帰はループへの書き換えが確実です。