Welllll в основном. Часть, с которой вы начинаете спотыкаться, - это когда вы говорите «начните сначала». Функция не начинается - звонит сам. Это будет проще увидеть в чистой функции - посмотрите на добавление.
def add(x, y):
if y == 0:
return x
return 1 + add(x, y-1)
Это добавит два числа в основном путем подсчета их (это ужасная идея, но для иллюстративных целей ...) давайте проследим это через несколько звонков.
>>> add(100, 4) = 1 + add(100, 3)
# because we're returning 1 + add(x, y-1)
... add(100, 3) = 1 + add(100, 2)
... add(100, 2) = 1 + add(100, 1)
... add(100, 1) = 1 + add(100, 0)
... add(100, 0) = 100 # this is called the base case.
Однако ответ не 100
, как это было бы, если ваша функция только начал снова. Каждый из обращений к add
решимости их значению, которое вставляется обратно в исходный пробег функции, так что у вас есть:
>>> add(100, 4) = 1 + (1 + add(100, 2)) # subbing out...add(100, 3)
= 1 + (1 + (1 + add(100, 1))) # ... add(100, 2)
= 1 + (1 + (1 + (1 + add(100, 0)))) # ... add(100, 1)
= 1 + (1 + (1 + (1 + 100))) # ... add(100, 0)
= 1 + 1 + 1 + 1 + 100 # because addition is associative
= 104
С примерами из пути, мы можем видеть, как это применяется к вашей функции. return
в условных работает отлично, но только выходит из самой внутренней функции.
# where a = "This should print n times"
# and b = "This should not print"
>>> test(2) = print(a); test(1); print(b)
... test(1) = print(a); test(0); print(b)
... test(0) = None # because of the early-exit
Поп все эти вещи и у вас есть:
>>> test(2) = print(a); (print(a); None; print(b)); print(b)
# test(1) ---^
# test(0)---------------^
Который имеет 2 print(a)
с и 2 print(b)
с.
первый раз да, но после этого вы возвращаетесь из рекурсивного вызова, и вы достигаете последнего 'print' –
Поскольку рекурсия приостанавливает дальнейшее выполнение до тех пор, пока вызываемая функция не завершится. Сделайте это 'return test (n-1)', если вы не хотите, чтобы «Это не должно печатать». – MSeifert
http://pythontutor.com/ – jonrsharpe