【发布时间】:2015-03-06 03:49:34
【问题描述】:
我只是在学习 ruby,KevinC 的回复 (in this link) 对我来说很有意义,但有一个例外。我不明白为什么代码包含在 arr.each do |i| 中#while... end 这部分对我来说似乎是多余的,因为“while”循环已经到达每个位置?谁能解释一下?
【问题讨论】:
标签: ruby bubble-sort
我只是在学习 ruby,KevinC 的回复 (in this link) 对我来说很有意义,但有一个例外。我不明白为什么代码包含在 arr.each do |i| 中#while... end 这部分对我来说似乎是多余的,因为“while”循环已经到达每个位置?谁能解释一下?
【问题讨论】:
标签: ruby bubble-sort
内部循环找到一个气泡并将其向上携带;如果它发现另一个更轻的气泡,它就会将它们调换并携带更轻的气泡。所以你需要多次遍历数组才能找到所有的气泡并将它们带到正确的位置,因为你不能同时漂浮多个气泡。
编辑:
each 在 KevinC 的代码中确实被滥用了,因为它没有用于其正常目的:产生集合的 元素。而不是arr.each,最好使用arr.size.times - 因为它会为读者提供更多信息。在块内重新定义i 是雪上加霜。虽然这些都不会导致代码出现错误,但它具有误导性。
代码的另一个问题是它不提供提前终止条件(swapped 在该问题的大多数其他答案中)。理论上,冒泡排序可以找到第一遍排序的数组;其他size - 1 步骤是不必要的。 KevinC 的代码仍然会在已经排序的数组中干巴巴的,从来没有意识到它已经完成了。
至于重写成无块代码当然是可能的,但你需要了解块语法在 Ruby 中非常惯用,而非块循环在 Ruby 世界中几乎闻所未闻。虽然 Ruby 有 for,但它几乎从未在 Ruby 中使用。但是……
arr.each do |i|
...
end
等价于
for i in arr
...
end
同样,至少对于数组的情况,相当于
index = 0
while index < arr.size
i = arr[index]
...
index += 1
end
【讨论】: