假设我想添加两个数字,但我只能递增和递减1.我可以通过多种方式解决这个问题,包括使用递归。当我添加m和n时,我可以使用以下Python定义:
def slowAdd(m, n):
if n == 0:
return m
else:
return 1 + slowAdd(m, n-1)
这对我来说真的很困惑。有人可以解释最终的回复电话如何运作?将Python添加到1时,Python如何解释定义函数的值?
答案 0 :(得分:4)
将其视为用正确的返回表达式替换“slowAdd(m,n-1)”(如果n = 0则为“m”,否则为“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
答案 1 :(得分:2)
好吧,让我们来看一个超级简单的功能。
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
。
答案 2 :(得分:1)
在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)))
答案 3 :(得分:1)
当我们执行程序时,我们称之为执行堆栈
当函数(A)调用另一个函数(B)时。程序在执行堆栈中保存函数A的上下文,以便在完成函数(B)时可以继续执行函数(A)。
上下文是函数的所有局部变量和剩余的指令。
让我们假设我们在调用slowAdd(1,9)之前调用这个函数就像这个slowAdd(1,9)一样,程序将保存上下文,这样它将保存n = 1的当前值和m =的当前值9,最后一条指令是1 + slowAdd(0,9)然后调用slowAdd(0,9) slowAdd(0,9)将返回9并且程序将返回到该函数的第一次调用。它将恢复上下文,它将使用返回值替换调用。 1 + slowAdd(0,9)将为1 + 9
答案 4 :(得分:1)
你可以在循环中添加一个print语句,你可以看到发生了什么,行[{1}}也可以写成import pandas as pd
df['Week:'] = pd.Series([pd.to_datetime(d) for d in df['Week:']])
df.sort_values(['Week:'], ascending = [False])
if n == 0: