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

问题描述

|| 我正在尝试使用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