试图用ruby编写一个排序程序 - 堆栈级别太深(系统堆栈错误)

时间:2011-03-07 18:32:36

标签: ruby stack-overflow

我正在阅读Chris Pine的书“Learn to Progam”(这是关于Ruby的)。现在我正在尝试编写一个对单词进行排序的程序。不幸的是我坚持:stack level too deep (system stack error) in line 16,如果我用Google搜索正确意味着存在无限循环,但我不知道为什么。

以下是代码:

words = []
wordss = []
word = 'word'
i = 0
k = 0

def sortw array
  i = 0
  if    (array.length == 1) || (array.length == 0)
  else sort array, [], [], i
  end
  return array
end

def sort unsorted, unsort, sorted, i
  k = 0 # The error should be here, according to command prompt
  while i < unsorted.length

    while (unsorted[i] < unsorted[k])
      if    k < unsorted.length
        k = k + 1
      elsif k == unsorted.length
        sorted.push unsorted[i]
      else unsort.push unsorted[i]
      end
    end

    i = i + 1
    sort unsorted, unsort, sorted, i
  end

  if unsort.length != 1
    i = 0
    sort unsort, [], sorted, i
  else sorted.push unsort[0]
  end

  return sorted
end

puts 'type one word per line...'
puts 'typing enter on an empty line sorts the inputted words'

while word != ''
  word = gets.chomp
  words = words.push word
end

wordss = (sortw words)

puts 'your words'
puts words
puts 'sorted here'
puts wordss

1 个答案:

答案 0 :(得分:1)

您收到错误,因为递归不会因排序算法问题而停止。在sort方法中,k始终小于unsorted.length。这会导致其他数组sortedunsort永远不会填充。

例如,尝试输入以下内容:

  • 斑马

此外,我认为您不想包含空行,因此我将更改代码:

words = words.push wordwords = words.push word if word != ''

这将创建unsorted数组:

  • [0]狗
  • [1] zebra
  • [2] cat

以下编号是递归sort方法的迭代。

#initial variable state:
i = 0
k = 1
  1. 狗=狗
    • 跳过第二个循环
    • i = 1
  2. 斑马&gt;狗
    • 跳过第二个循环
    • i = 2
  3. cat&lt;狗
    • 输入第二个while循环
      • k = 1,现在cat&lt;斑马,所以保持循环
      • k = 2,现在cat = cat,所以退出
    • i = 3
  4. 由于i现在等于unsorted数组长度,因此两个while循环永远不会再输入。
  5. 因此,以下代码会导致无限循环,因为没有任何内容被推送到unsort数组:

    if unsort.length != 1
      i = 0
      sort unsort, [], sorted, i #Problem is that `unsort` and `sorted` are empty
    elsif
    ...
    end