相关疑难解决方法(0)

如何增加ruby应用程序的堆栈大小.递归应用程序获取:堆栈级别太深(SystemStackError)

在stackoverflow.com上发布堆栈溢出问题,有多么有趣:-)

我正在运行一些递归的Ruby代码,我得到: "Stack level too deep (SystemStackError)"

(我很确定代码是有效的,我不是在无限的递归死亡螺旋中,但这不是重点)

有没有改变我的Ruby应用程序允许的堆栈深度/大小?

如果这是Ruby中的限制,我不太明白,因为错误说"堆栈级别",这让我觉得Ruby以某种方式计算堆栈的"级别",或者它只是意味着堆栈已满.

我试过在Vista和Ubuntu下运行这个程序,结果相同.在Ubuntu下我尝试用'ulimit -s'将堆栈大小从8192更改为16000,但这并没有改变任何东西.

编辑:感谢您的反馈.
我确实意识到使用递归函数可能不是最强大的方法.但这也不是重点.我只是想知道是否有办法增加堆栈大小..期间.正如我所提到的,我确实尝试在运行ruby脚本之前运行ulimit -s 16000 ..没有任何改进..我使用它错了吗?

Edit2:事实上我在代码的边缘情况下有一个无限递归.
当您收到"Stack level too deep"错误时,截断的ruby堆栈跟踪有点误导.
当具有涉及多个函数的递归行为时,您会得到递归数量远低于其实际值的印象.在这个示例中,可能会在超过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
Run Code Online (Sandbox Code Playgroud)

-Andreas

ruby recursion

34
推荐指数
4
解决办法
2万
查看次数

在递归例程中是否存在"堆栈级太深"错误的解决方法?

Ruby中的递归函数中是否存在Stack Overflow错误的解决方法?

比方说,我有这个块:

def countUpTo(current, final)
    puts current
    return nil if current == final
    countUpTo(current+1, final)
end
Run Code Online (Sandbox Code Playgroud)

如果我打电话countUpTo(1, 10000),我会收到一个错误:stack level too deep (SystemStackError).

它似乎在8187处突破.是否有一些函数我可以调用告诉Ruby忽略堆栈的大小,或者增加最大堆栈大小的方法?

ruby stack-overflow recursion tail-call-optimization

5
推荐指数
1
解决办法
2895
查看次数