微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

红宝石的递归调用中的堆栈级别太深错误

如何解决红宝石的递归调用中的堆栈级别太深错误

|| 我正在尝试使用ruby实现快速排序算法。看看我做了什么:
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
这产生了错误
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
为什么会这样呢?     

解决方法

我认为您示例中的问题是您需要明确的
return
if self.length<=1
  self[0]
本来应该
return [] if self == []
less.quick_sort + self[0] + greater.quick_sort #line 29
本来应该
less.quick_sort + [self[0]] + greater.quick_sort #line 29
这是一个工作示例
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,4,5]
    ,
less.quick_sort + self[0] + greater.quick_sort
该行在if语句之外,因此无论
self.length<=1
为true都会被执行。因此,该方法无限递归,从而导致堆栈溢出。 还应该指出,
self[0]
不会返回数组(除非
self
是数组的数组),因此在上面使用
Array#+
没有意义。作为quick_sort方法的返回值也没有意义。     ,在那部分中,您不应处理\“ = \”情况。仅应处理<和>。因此,您的算法永远不会停止,并且会导致无限递归。
if self[i]<=self[0]
  less << self[i]
else
  greater << self[i]
end
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。