Как я могу проверить идеальный квадрат в Ruby? - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь проверить, является ли число идеальным квадратом.

Это мой код:

def is_square(x)
  return true if
  math.sqrt(x).is_a? Integer
end

Есть идеи, почему оно не работает?

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

Результат Math#sqrt никогда не будет целочисленным, даже для идеальных квадратов.В общем, проверки типов не очень полезны в Ruby.

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

Сравнение с приведенным значением:

x == x.to_int

Проверьте, равен ли знаменатель 1:

x.denominator == 1

Проверьте, равен ли остаток по модулю 1 0:

x % 1 == 0

В качестве идиоматического выраженияRuby также не использует префиксы, такие как is_, но вместо этого добавляет вопросительный знак суффикса для методов предикатов:

def perfect_square?(x)
  # Implementation
end
0 голосов
/ 28 мая 2018

Во-первых, вам нужно использовать заглавные буквы от math до Math.

Другая проблема с этим кодом - возвращаемое значение Math.sqrt.Предположим, вы поставили 4 как значение x.Math.sqrt всегда возвращает число с плавающей точкой (десятичное число), даже если это число с плавающей точкой является круглым числом, поэтому результатом будет 2.0.Что касается Ruby и большинства языков программирования, 2.0 не является целым числом.Это все еще число с плавающей точкой, только у которого нет десятичной части.

Самый простой способ проверить, является ли число с плавающей точкой целым числом, состоит в том, чтобы изменить его на 1 (то есть разделить его на 1 и получитьостаток), что можно сделать с помощью %, а затем убедитесь, что этот остаток равен 0.

def is_square(x)
  return true if Math.sqrt(x) % 1 == 0
end

Эта функция все еще не идеальна;возвращает true для квадрата и nil для неквадрата.Вместо этого было бы разумнее вернуть false для неквадрата.

Это можно сделать, удалив if и просто вернув результат условного выражения.Кроме того, return в Ruby не требуется для последнего оператора блока.

def is_square(x)
  Math.sqrt(x) % 1 == 0
end
0 голосов
/ 28 мая 2018

Результат всегда с плавающей точкой:

Math.sqrt(4)
# => 2.0

Math.sqrt(4).class
#  => Float

Вам необходимо проверить, является ли результат числом без десятичных точек:

def is_square(x)
  Math.sqrt(x) % 1 == 0
end
0 голосов
/ 28 мая 2018
  1. Вы ошиблись Math, который является модулем постоянного удержания, предназначенным для математических операций.
  2. Math.sqrt(9) также возвращает float, так что это тоже не сработает.Но вы можете проверить остаток от деления на 1.
  3. Кроме того, стиль, в котором вы написали этот метод, действительно плох, его можно написать гораздо лучше.

Подводя итог, я бы сделал что-то вроде этого:

def is_square?(x)
  (Math.sqrt(x) % 1).zero?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...