Ben*_*ach 5 ruby stack-overflow recursion tail-call-optimization
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忽略堆栈的大小,或者增加最大堆栈大小的方法?
如果您使用 YARV(Ruby 1.9 的基于 C 的实现),您可以告诉 Ruby VM 打开尾调用优化:
RubyVM::InstructionSequence.compile_option = {
:tailcall_optimization => true,
:trace_instruction => false
}
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end
countUpTo(1, 10_000)
Run Code Online (Sandbox Code Playgroud)