首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby的递归调用中的堆栈级别太深错误

ruby的递归调用中的堆栈级别太深错误
EN

Stack Overflow用户
提问于 2011-04-17 22:13:20
回答 3查看 6.7K关注 0票数 2

我正在尝试使用ruby实现快速排序算法。看看我做了什么:

代码语言:javascript
复制
class Array

  def quick_sort  #line 14
    less=[];greater=[]
    if self.length<=1
      self[0]
    else
      i=1
      while i<self.length
        if self[i]<=self[0]
          less << self[i]
        else
          greater << self[i]
        end
      i=i+1
      end
    end
    less.quick_sort + self[0] + greater.quick_sort #line 29
  end
end
[1,3,2,5,4].quick_sort #line 32

这就产生了错误:

代码语言:javascript
复制
bubble_sort.rb:29:in `quick_sort': stack level too deep (SystemStackError)
    from bubble_sort.rb:29:in `quick_sort'
    from bubble_sort.rb:32

为什么会发生这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-17 22:19:42

我认为你的例子中的问题是你需要一个显式的return

代码语言:javascript
复制
if self.length<=1
  self[0]

应该是

代码语言:javascript
复制
return [] if self == []

代码语言:javascript
复制
less.quick_sort + self[0] + greater.quick_sort #line 29

应该是

代码语言:javascript
复制
less.quick_sort + [self[0]] + greater.quick_sort #line 29

下面是一个有效的示例

代码语言:javascript
复制
class Array

  def quick_sort
    return [] if self == []
    pivotal = self.shift;
    less, greater = [], []
    self.each do |x|
      if x <= pivotal 
        less << x
      else 
        greater << x
      end
    end
    return less.quick_sort + [pivotal] + greater.quick_sort
  end
end
[1,3,2,5,4].quick_sort # => [1, 2, 3, 4, 5]
票数 3
EN

Stack Overflow用户

发布于 2011-04-17 22:21:20

代码语言:javascript
复制
less.quick_sort + self[0] + greater.quick_sort

这一行在if语句之外,因此无论self.length<=1是否为true,它都会被执行。因此,该方法无限递归,这会导致堆栈溢出。

还应该指出的是,self[0]不返回数组(除非self是一个由数组组成的数组),因此对它使用Array#+没有任何意义。它作为quick_sort方法的返回值也没有意义。

票数 1
EN

Stack Overflow用户

发布于 2011-04-17 22:22:53

在这一部分中,您不应该处理"=“大小写。只应处理<和>。因此,您的算法永远不会停止并导致无限递归。

代码语言:javascript
复制
if self[i]<=self[0]
  less << self[i]
else
  greater << self[i]
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5694005

复制
相关文章

相似问题

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