对于Ruby中递归函数中的堆栈溢出错误,有什么解决方法吗?
举个例子,我有这样的代码块:
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end如果我调用countUpTo(1, 10000),我会得到一个错误:stack level too deep (SystemStackError)。
它似乎在8,187点突破。有没有什么函数可以调用,告诉Ruby忽略栈的大小,或者增加最大栈的大小?
发布于 2012-01-05 06:26:33
如果你正在使用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)发布于 2012-01-05 06:07:56
您可以重写您的代码片段,使其不是递归的:
# 'count_up_to' would be a more "Ruby" name ;-)
def countUpTo(current, final)
(current..final).each { |i| puts i }
end我很欣赏你的代码可能是你真正想要做的事情的抽象,但是如果你想出其他的迭代而不是递归的方法,这可能有助于形成你的解决方案。
HTH
发布于 2013-09-05 23:27:16
在Ruby2.0中,您可以使用RUBY_THREAD_VM_STACK_SIZE和其他环境变量指定堆栈大小(以字节为单位)。
https://stackoverflow.com/questions/8732550
复制相似问题