ホーム › エラー解決 › Ruby › stack level too deep
Ruby ERROR

Ruby SystemStackError: stack level too deep の原因と解決法

メソッドが自分自身を無限に呼び続けたときに発生するエラーです。再帰の終了条件の抜けや、意図しない自己呼び出しが原因です。

このエラーメッセージ

SystemStackError: stack level too deep

原因

❌ エラーになるコード

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は末尾再帰最適化がデフォルト無効のため、深い再帰はループへの書き換えが確実です。