#python #recursion
Вопрос:
Поэтому я пытаюсь создать простую программу, которая проверяет, есть ли в числе 2 8 в строке или нет. Я знаю, что могу просто сделать
def double_eights(n):
return '88' in str(n)
но я хотел попробовать написать рекурсивный метод ниже
def double_eights(n, counter=0):
#base cases
if counter == 2:
return True
if n == 0:
return False
#recursive calls
if n % 10 == 8:
return(double_eights(n//10, counter 1))
else:
return(double_eights(n//10), 0)
Однако, хотя это возвращает правильные результаты, из-за того, как передаются аргументы, иногда он возвращает кортеж с 0 для всех чисел, отличных от 8, которые он передает. Например:
>>> double_eights(2882)
(True, 0)
>>> double_eights(80808080)
((((False, 0), 0), 0), 0)
Есть ли способ, чтобы функция возвращала только значение True
или False
без необходимости разбора возвращаемых кортежей?
Заранее спасибо!
Комментарии:
1. Это простая опечатка —
double_eights(n//10), 0
так и должно бытьdouble_eights(n//10, 0)
.
Ответ №1:
Проблема кроется в последней строке вашего кода. Вы возвращаете результат double_eights(n//10)
вызова и 0
, таким образом, эти значения упаковываются tuple
.
Вы можете изменить последнюю строку своего кода на
return(double_eights(n//10, 0))
указать counter
значение, но это необязательно, так counter
как имеет значение по умолчанию
def double_eights(n, counter=0):
так что вам не нужно это уточнять. Окончательный код может выглядеть следующим образом:
def double_eights(n, counter=0):
#base cases
if counter == 2:
return True
if n == 0:
return False
#recursive calls
if n % 10 == 8:
return(double_eights(n//10, counter 1))
else:
return(double_eights(n//10))
Выход:
double_eights(2882)
True
double_eights(80808080)
False