另一个编码器被递归混淆
这个问题在这里已经有了答案:
那么,让我们看看一个超级简单的功能。
def super_simple_function():
return 0
当我做x = super_simple_function()
时会发生什么?
>>> x = super_simple_function()
>>> x
0
这是因为函数的返回值为零。 所以有一个函数对象,它在被调用时给出(返回)一个值。
让我们一行一行看看递归函数。 想象一下,我们通过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。 你可以想象,这个函数会一直调用自己,直到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
。
考虑一下作为代替 “slowAdd(M,N-1)” 与正确的返回表达式(无论是 “M” 如果n = 0,否则替补多 “1 + slowAdd(M,N-1)”)。
例:
slowAdd(5,3)
1 + slowAdd(5, 3-1)
1 + (1 + slowAdd(5, 2-1))
1 + (1 + (1 + slowAdd(5, 1-1)))
1 + (1 + (1 + 5))) // n=0
在返回n!= 0的过程中,该函数再次调用自身,并将第1个值加1。 我会用插图来更好地解释这一点。 以下是您所调用函数的情况:(slowAdd(1,3):)
slowAdd(1,3)
returns 1+slowAdd(1,2)
returns 1+slowAdd(1,1)
returns 1+slowAdd(1,0)
returns 0
所以发生的是:
1+3
=1+(1+2)
=1+(1+(1+1))
=1+(1+(1+(1+0)))
链接地址: http://www.djcxy.com/p/80463.html