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