Ruby 尝试编写排序方法
尝试通过使用递归编写自己的排序方法对数组进行排序(Pine的书)。在stackoverflow上看到了一些其他示例,但我的代码看起来与它们不同。到目前为止,有两件事我还不明白:Ruby 尝试编写排序方法,ruby,sorting,methods,recursion,Ruby,Sorting,Methods,Recursion,尝试通过使用递归编写自己的排序方法对数组进行排序(Pine的书)。在stackoverflow上看到了一些其他示例,但我的代码看起来与它们不同。到目前为止,有两件事我还不明白: 什么是包装器方法,为什么我需要一个?(我想我在密码里加了一个) 如何修复“堆栈级别太深”错误 编辑:新代码已更新,正常工作但不正确。 以下是我目前掌握的情况: def word_sorter unsorted, sorted if unsorted[1] == nil sorted.push unsorted
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
def word_分类器未排序,已排序
如果未排序[1]==nil
已排序。推送未排序[0]
字数(已排序)
elsif unsorted[0]“堆栈级别太深”意味着正在进行无限递归。在word_sorter的任何分支中,未排序的列表看起来都不会变短,因此它将永远运行。1)这里没有什么特别的事情。我们使用的是通俗易懂的英语(尽管是隐喻性的)。包装器方法是作为包装器的方法。包装物是一种包装物。您正在使用sort
方法包装word\u sorter
方法。您“需要”它是为了方便:当您从外部调用它时,sort
方法期望它的第二个参数为空列表,这会很奇怪。包装考虑到递归的明显接口与外部世界的明显接口不同这一事实
2) 仔细查看处理unsorted[0]>=unsorted[1]
的代码与else
情况(即unsorted[0]
时)的不同之处
3) 试着先用英语描述你的算法。然后试着拿出几张扑克牌,严格按照它来测试你的算法
4) 工作排序算法只需调用一次。所以,制定一个合适的排序算法,然后只调用它一次——在循环外,在读入所有要排序的值之后。您可能还想实际调用单词\u put
您应该首先通过一些简单的示例来尝试您的代码。例如,使用列表[3,2,1]
作为输入
在第一次调用中,它将匹配3>=2
条件。因此现在sorted=[2]
这个已经有两个问题了
2
不是排序列表中的第一个条目。您的算法不能对任何输入进行排序,这一定是有问题的
数组unsorted
根本没有改变,因此它将永远与这个数组循环,产生sorted=[2,2,2,2,2….]
您试图实现什么排序算法?“包装器方法”不是Ruby术语。大概它指的是一个方法,它不做任何其他事情,而是以特定的方式调用不同的方法。至于“堆栈级别太深”,这可能意味着您的递归正在无限地发生,这意味着您结束递归的机制永远不会发生。使用两个数组,其中一个数组的原始单词的顺序与gets呈现的顺序相同,然后检查相邻的单词以获得排序数组中的正确顺序。它应该始终按“最低”字(先按a,然后按b等),直到剩下最高的字,最后按到排序的数组中。请在[2,3,1]
上尝试您的算法。除非定义要排序的[2,1,3]
,否则它将无法正确运行;-)令人惊叹的!意识到真正的问题是我使用了错误的数组方法:ari.drop与ari.shift的工作原理不同,这正是我真正想要的。其他一些编辑使它工作得很好,但现在它在放入单词后继续返回get.chomp。谢谢同样,unsorted.push get.chomp
部分应该是循环中唯一的部分。排序调用和显示调用应该在循环之后进行。否则就是滥用循环的语义。你能分享代码重写吗?我从我还在使用内置排序方法时编写的原始排序程序中获取了代码。谢谢!我最终研究了不同的排序算法,并做出了我发现的第一个:冒泡排序。我把结果发布在我的博客上,2,3,1在其中起作用。我发现原来的代码告诉我2比3低,但它不是最低的。有没有一种方法可以使用min方法只找到最低的字符串并推送到一个新数组?@podopie['AXYZ','ABC','DEF'].min
为您提供'ABC'