我正在学习ruby和KevinC的response (in this link)对我来说很有意义,但有一个例外。我不明白为什么代码包含在arr.each do |i| #中...结束这部分对我来说似乎是多余的,因为'while‘循环已经命中了每个位置?有人能解释一下吗?
发布于 2015-01-08 13:08:12
内部循环找到一个气泡并将其带上;如果它找到另一个较轻的气泡,它会切换它们并携带较轻的气泡。因此,您需要多次遍历数组才能找到所有气泡并将它们带到正确的位置,因为您不能同时浮动多个气泡。
编辑:
each在KevinC的代码中确实被误用了,因为它并没有用于其正常用途:生成集合的元素。使用arr.size.times会比使用arr.each更好--因为它会给读者提供更多的信息。在代码块中重新定义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
endhttps://stackoverflow.com/questions/27833209
复制相似问题