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))
Цикл выполнится лишь раз и затем выход из функции.