尝试使用递归编写自己的排序方法对数组进行排序(Pine的书)。在stackoverflow上看到了一些其他的例子,但我的代码看起来与它们不同。到目前为止我还不了解的两件事:
编辑:新代码已更新,正常但无效。
这是我到目前为止所拥有的:
def word_sorter unsorted, sorted
if unsorted[1] == nil
sorted.push unsorted[0]
words_put(sorted)
elsif unsorted[0] <= unsorted[1]
sorted.push unsorted[0]
unsorted.shift
word_sorter(unsorted, sorted)
else
unsorted.push unsorted[0]
unsorted.shift
word_sorter(unsorted, sorted)
end
end
def words_put sorted
puts 'these are your words now organized.'
sorted.compact!
puts sorted.join(', ')
Process.exit
end
unsorted = Array.new
sorted = Array.new
puts 'list as many words as you want. I will sort them... I think'
while unsorted.last != ''
unsorted.push gets.chomp
if unsorted.last == ''
unsorted.pop
word_sorter(unsorted, sorted)
end
end
谢谢!
答案 0 :(得分:2)
1)这里没什么特别的。我们使用简单的英语(尽管比喻)。包装器方法是一种包装器的方法。包装是包装的东西。您正在使用word_sorter
方法包装sort
方法。为方便起见,你“需要”它:sort
方法从外部调用它时,期望第二个参数的空列表是很奇怪的。包装考虑到这样一个事实,即递归的明显界面与外界的明显界面不同。
2)仔细研究处理unsorted[0] >= unsorted[1]
的代码与else
案例的区别(即unsorted[0] < unsorted[1]
时)。
3)首先尝试用英语描述你的算法。然后试着拿出一些扑克牌并按照它来测试你的算法。
4)只需要调用一次工作排序算法。因此,在读入所有要排序的值之后,找出一个合适的排序算法,然后只调用一次 - 在循环之外。您可能还想实际调用words_put
。
答案 1 :(得分:0)
“堆栈级别太深”意味着您正在进行无限递归。在word_sorter的任何分支中,未排序的列表看起来都不会变短,所以它会一直运行。
答案 2 :(得分:0)
您应该首先通过一些简单的示例来尝试您的代码。例如。使用列表[3,2,1]
作为输入。
在第一次通话中,它将匹配3>=2
条件。现在sorted=[2]
。
这个问题已经存在两个问题了。
2
不是排序列表中的第一个条目。您的算法必须存在无法对任何输入进行排序的问题。unsorted
根本没有改变,因此它将永远与此循环,产生sorted=[2,2,2,2,2.....]
。