するにはどうしたらいいのか、スタックサイズのためのrubyアプリです。再帰アプリの取得:スタックレベルが深い(SystemStackError)

StackOverflow https://stackoverflow.com/questions/242617

  •  04-07-2019
  •  | 
  •  

質問

投稿のスタックオーバーフローの質問にstackoverflow.comどの楽しい:-)

私の走行も再帰的なRubyコードを取得します: "Stack level too deep (SystemStackError)"

なるだけでなく、コードの作品は、そんな無限再帰的な死亡-スパイラルはですが、実はそうではありませんとにかくポイント)

直しとかは出来ないんですか変更許可されているスタック深度-サイズのための私のRubyたします。

いかがこの制限はRubyでは誤差は"スタックレベル"は、このような印象Rubyなんだかカウントレベルのスタックの場合、またはあくまでも、スタックを行います。

しかしこのプログラムの下で両Vista、Ubuntuと同じ結果です。下にUbuntuうに変更するスタックサイズの"ulimit-s'から8192を16000が、それもずっと変わっていないものです。

編集:感謝しています。
私の実現を用いた再帰的機能はかなりのかかるものと思われます。でもそうではない点です。だけどのような不思議がある場合に増加させるスタックのサイズ..ます。となっていってみて走ulimit-s16000前にrubyスクリプト..な改善..思いが悪いのでしょうか。

Edit2:私が有する無限再帰端のコードです。
を切り捨てrubyのスタックトレースしてください "Stack level too deep" エラービット誤解を招きます。
時には再帰的挙動を伴う複数の機能が得らるという印象をrecursions大きく低下するものではありませんでした。この例では、可能性のあるもので衝突後のアルガルベカップではこれまで以上190話ですが、実際に周辺の15000話

tst.rb:8:in `p': stack level too deep (SystemStackError)
        from tst.rb:8:in `bar'
        from tst.rb:12:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
         ... 190 levels...
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:22

-アンドレアス

役に立ちましたか?

解決

Ruby用のCスタックでのオプションを使用しulimitまたは作成のルビーと一部のコンパイラ/リンカースタックサイズの旗が目印です。尾再帰って未だ実施されていないものも、Rubyの現在の支援のための再帰ないのではない。どん再帰は、も考えておいた方がよいでしょう対応言語の限界を書きコード方法は異なります。

他のヒント

この質問とその回答が日Ruby1.8.x用のCスタックです。Ruby1.9.x以降を使用VMでは、独自のスタックです。Ruby2.0.0以降のサイズのVMでスタックで制御することができますの RUBY_THREAD_VM_STACK_SIZE 環境変数となります。

まだお持ちでない無限の再帰の状況をごalgorythmはpobablyに適していないためのRubyで実施するためにrecirsiveます。に変換するalgorythmからの再帰異なる種類のスタックは簡単にいうとのこと。ることができます。

def recursive(params)
  if some_conditions(params)
     recursive(update_params(params))
  end
end

recursive(starting_params)

える

stack = [starting_params]
while !stack.empty?
  current_params = stack.delete_at(0)
  if some_conditions(current_params)
    stack << update_params(current_params)
  end
end

松本行弘書き込みます こちらの

Ruby用のCスタックで必要なもの 利用ulimitを指定する制限 スタック。

考えうるコードです。その他のポスターを先着できるhackのCコードの通訳です。しています。の結果を使用していること以上RAMとして保証しませんのブローのスタックです。

の本当に天皇が御手洗池で手を洗うのに反復アルゴリズムのために何をしようとしています。時memoisationできるものだけを使用しているのではないものでを押すとスタックの場合は交換できる再帰呼び出しと変更可能な状態です。

場合はございますのでご注意下さにこのようなものでしょSICP こちらの 一部のアイデア...

あるとともに、同誌掲載号の注目も簡単に修正LinuxまたはMacです。を示したことを強調しましたその他の回答、Rubyのシステムスタック設定です。簡単に変化させるこMacやLinuxの設定によりスタックサイズです。フォックスの例:

ulimit -s 20000

としての Ruby1.9.2 ることができテール-コールの最適化アーキテクチャのようなもの:

RubyVM::InstructionSequence.compile_option = {
  tailcall_optimization: true,
  trace_instruction: false
}

RubyVM::InstructionSequence.new(<<-EOF).eval
  def me_myself_and_i
    me_myself_and_i
  end
EOF
me_myself_and_i # Infinite loop, not stack overflow

を回避するには SystemStackError われている場合はエラーの再帰呼び出しは末法 の方法.もちろん、この例では、無限ループです。しかもデバッグ用の浅い再帰なければならない最適化前後の深再帰.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top