【问题标题】:While loops vs loop-doWhile 循环与循环执行
【发布时间】:2023-07-25 22:42:01
【问题描述】:

我正在编写代码来查找两个整数的最小公倍数。我首先将代码编写为 while 循环,它不会向命令行返回任何值。这是while循环:

def find_common_multiple(x, y)
  z = 0
  while z % x != 0 && z % y != 0 do
    puts z
    z += 1
  end
end

find_common_multiple(4, 6)
=>nil

据我了解,while 循环将继续运行,直到 while 条件不再被评估为 true。首先,我明白,由于我的代码目前是编写的,它会停止一个数字,即实际的最低公倍数。我并不担心这方面,我只是不明白为什么它根本没有运行。

我很好奇是否可以使用另一种类型的循环使其工作。使用 loop-do 我能够解决问题。这是代码:

def find_common_multiple(x, y)
  z = 0
  loop do
    z += 1
    if z % x === 0 && z % y === 0 
        puts z
    else
        nil
    end
    break if z % x === 0 && z % y === 0
  end

end

find_common_multiple(4, 6)
12
=>nil

我不明白为什么 while 循环不运行,但 loop-do 运行。我在 while 循环上的语法是错误的,还是我不理解它如何运作的基本原则?对此主题的任何澄清将不胜感激。谢谢!

附言这是我的第一个问题,我已经参考了指南,但如果您发现我没有遵循的任何内容,我也将不胜感激。

【问题讨论】:

  • 这里没有理由使用===== 就可以了(而且更有意义)。

标签: ruby loops while-loop


【解决方案1】:

while 循环没有运行,因为0 % 4 == 0(以及0 % 6 == 0)所以第一个条件返回false,并且循环永远不会执行。

【讨论】:

  • @AndrewMarshall - 完全正确,条件是z % x != 0,如果z == 0,则始终为false
  • 正确。最重要的是,当 OP 想要获得 LCM 时,用 0 开始循环是没有意义的。
  • 感谢您的回答,这完全有道理。
【解决方案2】:

应该是 OR 而不是 AND 操作:

def find_common_multiple(x, y)
  z = x > y  ?  x : y
  puts "#{z} ist the bigger of the two and the lowest possible candidate to be the lowest common multiple"
  while z % x != 0 || z % y != 0 do
    z += 1
  end
  puts z
end

它对您不起作用的原因:

你从零开始。 0 % 4 != 0 是假的,0 % 6 != 0 也是假的,所以它甚至不会进入while循环。

为什么 ||,而不是 &&

因为您希望它持续下去,只要两个数字都给出其他值,然后余数为零。使用 && 求值器,只要其中一个表达式为真,它就会立即停止。

从哪里开始

我也从两个候选者中较大的一个开始,因为它是最小公倍数的最低候选者。

【讨论】:

  • 这也是一个好点。谢谢!我希望我也可以检查您的答案,或者至少给它投票,但不幸的是,我还没有足够高的声誉来投票。