Что ж, давайте посмотрим на суперпростую функцию.
def super_simple_function():
return 0
Что произойдет, когда я сделаю x = super_simple_function()
?
>>> x = super_simple_function()
>>> x
0
Это потому, что значение функции return равно нулю. Итак, есть объект-функция, который при вызове дает (возвращает) вам значение.
Давайте посмотрим на вашу рекурсивную функцию построчно. Представьте, что мы передали 2 и 3 в качестве аргументов, например: slowAdd(2, 3)
.
Строка 1: def slowAdd(m, n)
Это означает, что первый аргумент равен m
, а второй - n
. Следовательно, в нашем случае m = 2
и n = 3
.
Строка 2: if n == 0
Это условие, которое срабатывает, когда n equals to 0
. Что ж, прямо сейчас n = 3
, поэтому это условие игнорируется.
Строка 3: return m
Поскольку n
не равно 0, эта строка пока игнорируется; мы вернемся к этому.
Строки 4 и 5: else: return 1 + slowAdd(m, n-1)
Здесь происходят три вещи.
- Получаем возвращаемое значение
slowAdd(m, n-1)
.
- Добавляем 1 к возвращаемому значению
- Возвращаем сумму из №2.
Эта функция называется рекурсивной из-за №1. Как вы понимаете, эта функция будет вызывать сама себя до n == 0
, после чего она вернет m
вместо 1 + slowAdd(m, n-1)
. И поскольку мы уменьшаем n
на 1 в каждой рекурсии, мы точно знаем, что n
в конечном итоге будет равно 0.
В основном это то, что делает функция, когда мы передаем (2, 3)
в качестве аргументов:
1st recursion: return 1 + slowAdd(2, 2)
2nd recursion: return 1 + slowAdd(2, 1)
3rd recursion: return 1 + slowAdd(2,0)
4th recursion: return 2 # n is finally 0!
Что в сумме составляет 2 + 1 + 1 + 1 = 5
.
person
spicypumpkin
schedule
30.01.2017
slowAdd(m, n-1)
. Итак, если бы у вас былоdef f(n): return 8 - n
и1 + f(1)
, вы получили бы 8. - person juanpa.arrivillaga   schedule 31.01.2017recursion with slowAdd()
, как он написал бы сfor
илиwhile
циклами. Думаю, он отвечал на @Barmar. - person spicypumpkin   schedule 31.01.2017