我对学习红宝石很新,我正在通过Chris Pine的学习计划工作。他建议尝试的一个练习是编写一个shuffle方法(我知道#shuffle
方法)。到目前为止,我已经提出了这个代码,它似乎可以完成这项工作:
array_to_shuffle = []
puts "Give me a list of words to shuffle, press enter on an empty line for the result."
input = gets.chomp
while input != ""
array_to_shuffle = array_to_shuffle.push(input)
input = gets.chomp
end
def recursive_shuffle(array_to_shuffle, shuffled_array = [])
return shuffled_array unless array_to_shuffle.size > 0
array_size = array_to_shuffle.size()
random_number = rand(1..array_size)-1
element_transfered = array_to_shuffle [random_number]
shuffled_array = shuffled_array.push(element_transfered)
array_to_shuffle.delete(element_transfered)
recursive_shuffle(array_to_shuffle, shuffled_array)
end
puts recursive_shuffle(array_to_shuffle)
然而,考虑到它实际上做了什么,它是相当啰嗦的。我有什么方法可以改进吗?
答案 0 :(得分:2)
您的想法是随机选择元素,直到您选择了所有元素。
除了详细程度之外,您遇到的另一个问题是您使用#delete
。因此,如果数组中有两个重复元素,那么在混洗结果中只能得到一个。
你也改变了传递的数组,这通常是不可取的。以下是相同算法的实现:
def recursive_shuffle(to_shuffle, shuffled = [])
return shuffled if to_shuffle.empty?
to_shuffle = to_shuffle.dup if shuffled.empty?
element = to_shuffle.sample
to_shuffle.delete_at(to_shuffle.index(element))
recursive_shuffle(to_shuffle, shuffled + [element])
end
至于更简单的解决方案:
array.sort_by { rand }