首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于递归例程中的“堆栈级别太深”错误,有解决方法吗?

对于递归例程中的“堆栈级别太深”错误,有解决方法吗?
EN

Stack Overflow用户
提问于 2012-01-05 03:11:00
回答 3查看 2.9K关注 0票数 5

对于Ruby中递归函数中的堆栈溢出错误,有什么解决方法吗?

举个例子,我有这样的代码块:

代码语言:javascript
复制
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忽略栈的大小,或者增加最大栈的大小?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 06:26:33

如果你正在使用YARV ( Ruby 1.9的基于C的实现),你可以告诉Ruby VM开启尾部调用优化:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2012-01-05 06:07:56

您可以重写您的代码片段,使其不是递归的:

代码语言:javascript
复制
# 'count_up_to' would be a more "Ruby" name ;-)
def countUpTo(current, final)
  (current..final).each { |i| puts i }
end

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

HTH

票数 2
EN

Stack Overflow用户

发布于 2013-09-05 23:27:16

在Ruby2.0中,您可以使用RUBY_THREAD_VM_STACK_SIZE和其他环境变量指定堆栈大小(以字节为单位)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8732550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档