Ruby 使用.min和max并推送到数组
我正在阅读Chris Pine的“学习编程”一书,我正在第10章的练习中,他要求你在不使用.sort的情况下按字母顺序排列单词列表。我使用了min/max(他可能也不打算让您使用,但这只是一个开始)。这是可行的,除非我使用.min并将该值推送到排序数组中,结果是z到a,而不是我预期的a到z。当我使用max(我在下面的代码中使用它只是为了让它工作)时,结果是a到z。知道为什么吗Ruby 使用.min和max并推送到数组,ruby,arrays,sorting,Ruby,Arrays,Sorting,我正在阅读Chris Pine的“学习编程”一书,我正在第10章的练习中,他要求你在不使用.sort的情况下按字母顺序排列单词列表。我使用了min/max(他可能也不打算让您使用,但这只是一个开始)。这是可行的,除非我使用.min并将该值推送到排序数组中,结果是z到a,而不是我预期的a到z。当我使用max(我在下面的代码中使用它只是为了让它工作)时,结果是a到z。知道为什么吗 puts "Enter a list of words, separated by commas. Hit enter
puts "Enter a list of words, separated by commas. Hit enter when done."
puts "This program will sort your words alphabetically."
word_list = gets.chomp.downcase
word_array = word_list.split(", ")
def sort_words (words)
sorted_array = [] if sorted_array.nil?
words = [] if words.nil?
until words.length == 0
first_word = words.max #method should be .min (?)
words.delete(first_word)
sorted_array.push(first_word)
sort_words(words)
end
puts sorted_array
end
sort_words(word_array)
这样想吧
unsorted = [1, 3, 2, 5, 4]
sorted = []
未排序。最大值为5。删除它并将其推到已排序的
unsorted = [1, 3, 2, 4]
sorted = [5]
unsorted = [1, 3, 2]
sorted = [5, 4]
未排序。最大值为4。删除它并将其推到已排序的
unsorted = [1, 3, 2, 4]
sorted = [5]
unsorted = [1, 3, 2]
sorted = [5, 4]
我想你可以看出错误在哪里push
添加到数组的末尾,因此您需要从最小到最大构建排序的。因此使用unsorted.max
代码的问题是在删除max之后在循环内调用sort\u words(words)
。这是一种。虽然可以使用递归编写此排序例程,但将循环与递归混合会导致问题
发生的情况是,循环正在删除max元素,然后再次调用sort_单词,使用相同的列表减去max元素。然后它一次又一次地这样做。你会接到一大堆电话,比如
call_stack sorted_array (local to each call)
sort_words([1,3,2,5,4]) [5]
sort_words([1,3,2,4]) [4]
sort_words([1,3,2]) [3]
sort_words([1,2]) [2]
sort_words([1]) [1]
sort_words([]) []
由于words
是一个引用,它不会在每次调用中复制,因此对sort\u words
的每次调用都在同一个单词列表上工作。每次呼叫都会将单词
缩小一个。当words
为空时,所有循环退出并打印其结果,但堆栈首先从底部返回!你得到的是什么样子
1
2
3
4
5
但是如果您将put sorted_array
更改为put“sorted array:{sorted_array}”
您将看到实际发生的情况
sorted array: []
sorted array: ["1"]
sorted array: ["2"]
sorted array: ["3"]
sorted array: ["4"]
sorted array: ["5"]
明白了,谢谢。在循环中使用递归过度。已删除循环中对方法的调用。还将已排序的_数组转换为字符串以供输出
puts "Enter a list of words, separated by commas. Hit enter when done."
puts "This program will sort your words alphabetically."
word_list = gets.chomp.downcase
word_array = word_list.split(", ")
def sort_words (words)
sorted_array = [] if sorted_array.nil?
words = [] if words.nil?
until words.length == 0
first_word = words.min
words.delete(first_word)
sorted_array.push(first_word)
end
sorted_words = sorted_array.join(", ")
puts sorted_words
end
sort_words(word_array)