以下代码会出错:
def bubble_sort(arr)
until arr == arr.sort do
(arr.count - 1).times do |i|
(arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
end
end
arr
end
(eval):433:(eval):433:编译错误(SyntaxError)
(eval):426:语法错误,意外的kDO_COND,期待kEND (arr.count - 1).times do | i | ^
(eval):433:语法错误,意外的kEND,期待$ end
但下面的另一个变体成功通过。为什么呢?
def bubble_sort(arr)
begin
(arr.count - 1).times do |i|
(arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
end
end until arr == arr.sort
arr
end
答案 0 :(得分:0)
我不知道为什么,但如果您将第一个代码更改为以下代码,它将会解决:
def bubble_sort(arr)
total = (arr.count - 1)
until arr == arr.sort do
total.times do |i|
(arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
end
end
arr
end
我已经使用您的link对其进行了测试,所以我猜测可能没有正确配置,因为当我第一次在total
中添加until
时,它变成了无限循环。但有人必须检查它反对ruby,这可能是一个错误。
答案 1 :(得分:0)
经过一些调试后,这看起来像是1.8.7上的irb
中的一个错误(labs.codecademy.com使用的版本)。在本地,当安装Ruby 1.8.7-p374时,我看到同样的事情。但是,如果我将代码作为普通的Ruby文件运行,它就可以正常工作。
然而,Ruby 1.8.7是officially retired,在我看来,Codecademy Labs网站也不再需要维护,所以我建议学习Ruby并使用“完整”Codecademy站点,或在本地安装更新版本的Ruby(我推荐2.0.0)。
答案 2 :(得分:-1)
在Ruby中,until
块不使用do
,所以你应该这样做:
def bubble_sort(arr)
until arr == arr.sort
(arr.count - 1).times do |i|
(arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
end
end
arr
end
修改:扩展代码,使其包含原始问题的算法。此代码适用于ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
。