有人可以解释这段代码吗?我从练习的解决方案部分得到它,所以它确实运行。为什么sorted
未使用==
进行比较,为什么sorted = false
需要在sorted
之后添加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
答案 0 :(得分:1)
我相信你最常将这个算法与Ruby语法混淆。
对于算法,您不能删除sorted = true
之后的行until
,因为您的循环永远不会结束,因为sorted
永远不会变为真。
关于Ruby语法,您所写的内容是正确的,您可以编写until sorted
的更长形式,即until sorted == true
。您的问题是删除sorted = true
,除非在if
条件下再次变为false,否则会将其赋值为true。
答案 1 :(得分: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