И и Или логика поменялась в базовом цикле - PullRequest
0 голосов
/ 21 июня 2011

Я только начал использовать рельсы, но эта логика кажется мне обратной.

weight = 70
num_pallets = 25
while weight < 100 and num_pallets <=30
    weight += 1
    num_pallets += 1
    puts weight
end

Я чувствую, так как цикл должен работать, пока оба критерия удовлетворены, выход должен быть до 100 для веса. ОДНАКО ...

When I use and the output is 70 71 72 73 74 75, 76
when I use "or" in place of "and" the output is 70, 71 ... 100

Кто-нибудь может объяснить, почему это происходит?

Ответы [ 5 ]

2 голосов
/ 21 июня 2011
while weight < 100 and num_pallets <=30

будет работать до тех пор, пока не будет weight >= 100 или num_pallets > 30, поскольку это приведет к ложному утверждению

while weight < 100 or num_pallets <=30

, пока оба значения weight >= 100 и num_pallets > 30 не станут истинными, посколькуутверждение ложное.

1 голос
/ 21 июня 2011

Анализ этого есть хитрость.

while weight < 100 and num_pallets <=30
    weight += 1
    num_pallets += 1
    puts weight
end

В конце будет обратное.

weight >= 100 or num_pallets > 30

Многие люди делают такую ​​логику в обратном порядке.

  1. Запишите, что должно быть верно в конце цикла.

  2. Запишите логическую инверсию этого условия.

  3. Используйте обратное условие для while.

Это нечто большее, чем это, но оно должно помочь вам начать.

0 голосов
/ 21 июня 2011

Как написано, этот цикл будет выполняться только 5 раз, потому что ваш оператор while в настоящее время требует, чтобы операторы BOTH были истинными.Следовательно, поскольку num_pallets начинается в 25 и заканчивается в 30, этот цикл будет выполняться только 5 раз.Однако, если вы измените строку на:

weight, num_pallets = 70, 25
while weight < 100 || num_pallets <=30    #Changed to "OR"
  weight, num_pallets = weight + 1, num_pallets + 1
  puts weight
end

... она будет работать 30 раз.Обратите внимание, что единственное значимое изменение выше - это изменение с И на ИЛИ в строке while.

0 голосов
/ 21 июня 2011

цикл должен работать, пока оба критерия выполнены - правильно.

ТАК, если один из критериев не пройден, цикл остановится.

0 голосов
/ 21 июня 2011

and возвращает true, если оба операнда имеют значение true.

В вашем случае num_pallets равно 31 после 6 итераций, что приводит к ложному второму выражению, таким образом, целое выражение возвращает false.

or возвращает значение true, если любой из операндов имеет значение true.В первых 6 итерациях оба выражения верны (weight меньше 100, а num_pallets меньше или равно 30).В седьмой итерации num_pallets равно 31, поэтому второе выражение ложно, но weight все еще меньше 100, поэтому цикл выполняется до тех пор, пока weight не станет больше 100.

...