Что вам не хватает, так это базовый случай, который может вернуть True
. Ваша функция возвращает True
, только если рекурсивный вызов той же функции возвращает True
. Что может произойти, только если другой рекурсивный вызов той же функции вернет True
. Который может ... и так далее. Таким образом, единственное, что может произойти, это возвращение False
или повторение навсегда (или, скорее, повторение 1000 раз, пока вы не получите исключение).
В целом, для любого рекурсивного решения нужны две части: базовый случай, который вы можете решить немедленно, и рекурсивный случай, который сводит проблему к базовому. Вы написали вторую часть - сложную - но пропустили первую.
Один очевидный базовый случай - либо a == b
, либо a == 1
. Если любое из этих значений истинно, то вы знаете, что a
- это степень b
(первая или нулевая степень соответственно), поэтому вы можете немедленно вернуть True
. Итак, давайте попробуем один из них:
def is_power(a,b):
if a == b:
return True
if(a % b == 0):
a = a/b
if(is_power(a,b)):
return True
return False
Теперь это работает для многих значений - is_power(16, 2)
, is_power(6561, 3)
и т. Д.
Но, если это не Python 2, есть еще одна проблема: a/b
возвращает число с плавающей запятой, а не int, что означает, что ваш следующий рекурсивный шаг может из-за проблем с округлением с плавающей запятой вычислить a % b
и получить что-то вроде 1e -302 вместо 0, поэтому a % b == 0
будет ложным, и вы зайдете слишком далеко и продолжите деление. Это в конечном итоге достигнет 0 и, наконец, вернет True (правильный ответ по неправильной причине), но если для этого потребуется более 1000 шагов, сначала вы достигнете предела рекурсии и вызовете исключение.
Чтобы это исправить, просто используйте //
вместо /
.