На мой взгляд, самый простой - но, возможно, немного долго - способ делать то, что вам нужно сделать, это просто пишу этот рекурсивный метод следующим образом:
def power_of_two?(number)
continue = true
if number == 1
return true
end
if number % 2 != 0
return false
else
while continue == true do
if number.to_f/2.0 == 2.0
continue = false
return true
else
if number % 2 != 0
continue = false
return false
else
number /= 2
continue = true
end
end
end
end
end
Одним из них является сила два (2^0), поэтому он сначала проверяет, является ли указанное число равным 1. Если нет, оно проверяет, является ли оно нечетным, потому что 1 является единственным нечетным числом, которое является степенью двух.
Если он нечетный, он возвращает false и переходит к инструкции else. Он будет проверять, является ли число, деленное на 2, равным двум, потому что тогда это, очевидно, было бы силой 2. Оно делает это как поплавок, потому что 5/2 в Ruby вернется 2.
Если это неверно, затем снова проверяет, является ли число нечетным - ненужным в первом раунде, необходимым после этого. Если число нечетное, оно будет делить число на два, а затем сделать цикл в другое время.
Это будет продолжаться до тех пор, пока программа не решит себя, получив 2 или любое нечетное число и вернет true или false соответственно.
Почему вы не используете функцию log2?Должен дать вам целое число, если вход находится на^2. Google '' 'log2 1024''' – urban
Не специалист по Ruby, но кажется, что вы используете метод инъекции для целого числа вместо массива – Dleep
Я попытался преобразовать num в массив с помощью' num.to_a', но это не сработает для меня – Shawn