0

有人可以解释这段代码吗?我从练习的解决方案部分得到它,所以它确实运行了。为什么不sorted比较 using ==,为什么sorted = false需要添加sortedafter until

def bubble_sort(arr)
  sorted = false
  until sorted
    sorted = true
    (arr.count - 1).times do |i|
      if arr[i] > arr[i + 1]
        arr[i], arr[i + 1] = arr[i + 1], arr[i]
        sorted = false
      end
    end
  end

  arr
end

我本来希望代码是这样的:

sorted = false
until sorted == true do

但是,当我尝试用它替换它时,出现以下错误:

eval):12: (eval):12: compile error (SyntaxError)
(eval):3: syntax error, unexpected kDO_COND, expecting kEND
    (arr.count - 1).times do |i|
                        ^
(eval):12: syntax error, unexpected kEND, expecting $end

这是出现错误的完整代码:

def bubble_sort(arr)
  sorted = false
  until sorted == true
    (arr.count - 1).times do |i|
      if arr[i] > arr[i + 1]
        arr[i], arr[i + 1] = arr[i + 1], arr[i]
        sorted = false
      end
    end
  end

  arr
end
4

2 回答 2

1

我相信您主要将算法与 Ruby 语法混淆。

至于算法,你不能删除sorted = true,之后的行until,因为你的循环永远不会结束,因为sorted永远不会变成真的。

关于 Ruby 语法,你写的是正确的,你可以写更长的形式until sorted,即until sorted == true. 您的问题是删除sorted = true将 true 分配给 sorted,除非它在if条件下再次变为 false。

于 2013-05-26T13:17:16.047 回答
0

不要混淆===。一个是赋值运算符,另一个是比较运算符。

sorted = false # sets initial value for a flag
until sorted # check if the flag is true at beginning of iteration
  # code that can change `sorted`
end

更新

在这种情况下,这两种形式是等价的。没有区别。两者都有效。

until sorted
until sorted == true
于 2013-05-26T12:35:15.930 回答