@qw1klyy

Рекурсивный вызов в цикле?

Привет. Помогите разобраться с тем, как работает рекурсивный вызов в цикле. Пытался рассмотреть это через стек, но так ничего и не понял.
def f(x):
    if x==0:
        return 0
    for i in range(2):
        print(x)
        f(x-1)
print(f(3))

Каким образом выводится X и почему он никогда не равняется нулю???64ce65ca062cb599246312.png
  • Вопрос задан
  • 204 просмотра
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
x - равняется 0 в твоем коде. Перенеси print(x) в самый верх и увидишь. Рекурсия это бесконечный цикл вызова функцией самой себя, до тех пор пока базовое состояние не прервет его (одно или несколько). None ты в конце видишь потому что это printтебе его возвращает, у тебя уже есть print внутри функции.
def f(x):
    print(x)
    if x==0:
        return 
    else:
        f(x-1)         
f(3)
. В твоем случае он тоже выйдет и return 0 он выполняет, замени return на pass и получишь бесконечную рекурсию.

Насчет None у тебя вот такая ситуация print(print(1))

ОТРЕДАКТИРОВАНО После дискусии с Zzzz9, выяснилось, что я не прав насчет None. Базовый кейс в рекурсии останавливает рекурсию, но не выходит из функции. Что бы мы вернули значение базового кейса нам нужно добавить return к рекурсивному случаю. Например
def f(x):
    if x==0:
        return 100
    else:
        f(x-1)
print(f(3))

Вот так выход из рекурсии настает, но рекурсивный кейс не имеет return и функция вернет None а вот в такой вариации
def f(x):
    if x==0:
        return 100
    else:
        return f(x-1)
print(f(3))
Функция вернет 100. Насчет print я полную глупость написал, он возвращает None и я подумал, что это имеет место. Глупость полная. если мы добавляем return к рекурсивному кейсу то выведет то что возвращает базовый кейс. А базовый кейс только останавливает рекурсию но не выходит из функции.

Насчет цикла если мы добавим return к рекурсивному кейсу то for цикл выполнится только один раз, потому что базовый кейс остановит рекурсию а рекурсивный кейс имеет return соответсвенно, функция напечатает изменение x + один добавочный 0, который возвращает return в базовом кейсе. Например
def f(x):
    print(x)
    if x==0:
        return 'Конец'
    for i in range(10):
        return f(x-1)
print(f(3))
Цикл выполнится лишь раз и затем выход из функции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы