Ruby - определите, является ли число простым числом

Я работаю над проблемами в Project Euler , чтобы научиться программировать на Ruby. Я знаю, что для этого есть встроенная функция , но я избегаю встроенных функций, которые помогают мне учиться.

Поэтому я должен написать метод, чтобы определить, является ли число простое. Первый метод работает, а второй нет. Кто-нибудь может объяснить, почему?

 def is_prime n
  for d in 2..(n - 1)
   if (n % d) == 0
    return false
   end
  end

  true
 end

 def is_prime2 n
  foundDivider = false
   for d in 2..(n - 1)
    foundDivider = ((n % d) == 0) or foundDivider
   end
  not foundDivider
 end

15
задан Jaco Pretorius 29 August 2010 в 10:18
поделиться

1 ответ

Это потому, что = имеет более высокий приоритет, чем или. См. Таблицу приоритетов операторов Ruby ниже (от самого высокого к самому низкому приоритету):

[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
defined?
not
or and
if unless while until
begin/end

Проблемная строка анализируется как...

(foundDivider = ((n % d) == 0)) or foundDivider

... что, безусловно, не то, что вы имеете в виду. Есть два возможных решения:

Выберите приоритет, который вы действительно имеете в виду...

foundDivider = (((n % d) == 0) or foundDivider)

...или используйте вместо этого оператор ||, который имеет более высокий приоритет, чем = :

foundDivider = ((n % d) == 0) || foundDivider
18
ответ дан 1 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: