Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用.min和max并推送到数组_Ruby_Arrays_Sorting - Fatal编程技术网

Ruby 使用.min和max并推送到数组

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

我正在阅读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 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)