Python — Возвращает одно значение из рекурсивного вызова с 2 аргументами

#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