另一个编码器被递归困惑

时间:2017-01-30 22:50:43

标签: python algorithm recursion return

假设我想添加两个数字,但我只能递增和递减1.我可以通过多种方式解决这个问题,包括使用递归。当我添加m和n时,我可以使用以下Python定义:

def slowAdd(m, n):
    if n == 0:
       return m
    else:
       return 1 + slowAdd(m, n-1)

这对我来说真的很困惑。有人可以解释最终的回复电话如何运作?将Python添加到1时,Python如何解释定义函数的值?

5 个答案:

答案 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 = 2n = 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)
这里发生了三件事。

  1. 我们收到slowAdd(m, n-1)
  2. 的返回值
  3. 我们在返回值
  4. 中加1
  5. 我们从#2返回总和。
  6. 由于#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: