5

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)

它似乎在 8187 处中断。我可以调用一些函数来告诉 Ruby 忽略堆栈的大小,或者增加最大堆栈大小的方法吗?

4

3 回答 3

2

您可以重写您的代码段不递归:

# 'count_up_to' would be a more "Ruby" name ;-)
def countUpTo(current, final)
  (current..final).each { |i| puts i }
end

我很欣赏您的代码可能是您真正想要做的事情的抽象,但如果您考虑其他迭代而不是递归的方法,它可能有助于形成您的解决方案。

高温高压

于 2012-01-04T22:07:56.287 回答
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)
于 2012-01-04T22:26:32.840 回答
2

在 Ruby 2.0 中,您可以使用RUBY_T​​HREAD_VM_STACK_SIZE和其他环境变量指定堆栈大小(以字节为单位) 。

于 2013-09-05T15:27:16.427 回答