另一个编码器被递归混淆

这个问题在这里已经有了答案:

  • 什么是尾递归? 23个答案

  • 那么,让我们看看一个超级简单的功能。

    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)
    这里发生了三件事。

  • 我们收到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


    考虑用正确的返回表达式替换“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  
    

    在返回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/14163.html

    上一篇: Another Coder Confused by Recursion

    下一篇: What is tail recursion optimization?