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

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忽略堆栈的大小,或者增加最大堆栈大小的方法?

And*_*imm 2

如果您使用 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)