Как установить начальное значение для переменной в рекурсивной функции в Python?

#python #function #recursion

#питон #функция #рекурсия #python

Вопрос:

Это общая проблема, с которой я продолжаю сталкиваться. Поскольку я чувствую, что этот вопрос лучше всего задать на примере, я создал функцию, чтобы проиллюстрировать общую проблему, с которой я столкнулся.

 def function(a):
    b=56
    if a>0:
        b=b 2
        a=a-1
        return function(a)
    else:
        print(b)
  

Здесь я пытаюсь установить начальное значение для b , которое будет меняться в зависимости от a . Например, если a=1 я хотел бы, чтобы функция возвращала 58 , но она действительно возвращает 56 . Я понимаю, что всякий раз, когда функция выполняет обратный цикл, она сбрасывается b как 56 , поэтому функция всегда будет возвращаться, 56 независимо от того, что a есть. Мне было интересно, как я мог бы установить начальное значение как 56 без его сброса каждый раз.

Я надеюсь, что в этом есть смысл! Спасибо за помощь!

Ответ №1:

Отредактировано: В зависимости от вашего варианта использования, if b также может быть параметром состояния рекурсии. Поскольку b необходимо определить с помощью a , мы можем установить начальное значение b , когда b is None

 def func(a, b=None):
  if b is None:
    # b is not set, determine `b` now depending on `a`
    b = 56     # fill-in other cases here   
  if a > 0:
    b  = 2
    a -= 1
    return func(a, b)
  else:
    return b

func(1)
  

Ответ №2:

Типичный подход к выполнению такого рода действий заключается в том, чтобы ваша рекурсивная функция принимала «аккумулятор» ( b здесь) в качестве дополнительного параметра. Тогда ваша фактическая функция просто вызывает ее с желаемым начальным значением, здесь 56.

Для вашего примера это было бы:

 def recursive(a, b):
    if a>0:
        b=b 2
        a=a-1
        return recursive(a, b)
    else:
        print(b)

def function(a):
    return recursive(a, 56)
  

Обратите внимание, что вы могли бы упростить, recursive используя if оператор return recursive(a - 1, b 2) . И вы, вероятно, хотите return b , а не просто print это.