0

下面的代码给出了一个错误:

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
4

3 回答 3

0

经过一番调试,这看起来像是irb1.8.7(labs.codecademy.com 使用的版本)中的一个错误。在本地,安装 Ruby 1.8.7-p374 时,我看到了同样的情况。但是,如果我将代码作为普通的 Ruby 文件运行,它就可以正常工作。

然而,Ruby 1.8.7 已经正式退役,而且在我看来 Codecademy Labs 站点也不再维护,所以我建议要么通过“完整”的Codecademy站点学习 Ruby,要么安装更新版本的 Ruby(我在本地推荐 2.0.0)。

于 2013-07-20T17:21:23.200 回答
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

我已经用你的链接测试了它,所以我猜它可能没有正确配置,因为当我第一次添加它totaluntil,它变成了一个无限循环。但是有人必须对照红宝石检查它,这可能是一个错误。

于 2013-07-20T13:07:29.740 回答
-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]

于 2013-07-19T21:01:28.857 回答