不应该';这个Python函数是否总是返回6?

不应该';这个Python函数是否总是返回6?,python,Python,我是Python新手,学习函数。我遇到了下面的函数,我完全理解它是如何工作的。在我看来,无论b的值是多少,答案都应该是6,但事实并非如此 代码 我对所发生事情的理解 因为b不是0,所以它继续 rest被分配值3,1,并再次运行该函数 因为b是1并且不等于0,所以它继续执行rest rest被分配值3,0,并再次运行该函数 由于b现在为零,因此返回值0 然后转到value,其值为3+3,因为a的值为3,rest的值为3,即(3,0) 它返回值6 但是如果我赋值mult(3,4),它将返回值12。按

我是Python新手,学习函数。我遇到了下面的函数,我完全理解它是如何工作的。在我看来,无论
b
的值是多少,答案都应该是6,但事实并非如此

代码

我对所发生事情的理解

  • 因为
    b
    不是0,所以它继续
  • rest
    被分配值
    3,1
    ,并再次运行该函数
  • 因为
    b
    是1并且不等于0,所以它继续执行
    rest
  • rest
    被分配值
    3,0
    ,并再次运行该函数
  • 由于
    b
    现在为零,因此返回值0
  • 然后转到
    value
    ,其值为3+3,因为
    a
    的值为3,
    rest
    的值为3,即
    (3,0)
  • 它返回值6
  • 但是如果我赋值
    mult(3,4)
    ,它将返回值12。按照我的理解,这是不可能的。显然,我不理解逻辑流程。我做错了什么

  • mult()
    3,2
    调用(这是调用#1)

  • 3,1
    调用
    mult()
    (这是调用#2)

  • 3,0
    调用
    mult()
    (这是调用#3)

  • 它返回0(因为
    b
    为零)调用#2

  • call#2现在返回3+0来调用#1

  • 调用#3现在返回3+3

  • 基本上,每次调用都会将
    a
    值增加
    a
    ,递归地深入到istelf
    b
    次。因此,将3自身加4次将得到12

  • mult()
    3,2
    调用(这是调用#1)

  • 3,1
    调用
    mult()
    (这是调用#2)

  • 3,0
    调用
    mult()
    (这是调用#3)

  • 它返回0(因为
    b
    为零)调用#2

  • call#2现在返回3+0来调用#1

  • 调用#3现在返回3+3


  • 基本上,每次调用都会将
    a
    值增加
    a
    ,递归地深入到istelf
    b
    次。因此,将3加4次将得到12。

    您可以对代码进行插入,以便更容易地看到发生了什么

    def mult(a, b):
        print "mult(%s, %s)"%(a, b)
        if b == 0:
            return 0
        rest = mult(a, b - 1)
        value = a + rest
        print "returns %s"%value
        return value
    print "3 * 2 = ", mult(3, 4)
    

    由于递归,print语句是嵌套的


    也就是说,
    mult(3,0)
    返回3,
    mult(3,1)
    返回6,依此类推

    您可以插入代码,以便更容易地查看发生了什么

    def mult(a, b):
        print "mult(%s, %s)"%(a, b)
        if b == 0:
            return 0
        rest = mult(a, b - 1)
        value = a + rest
        print "returns %s"%value
        return value
    print "3 * 2 = ", mult(3, 4)
    

    由于递归,print语句是嵌套的


    例如,
    mult(3,0)
    返回3,
    mult(3,1)
    返回6,依此类推该函数的基本逻辑是:

    让我们(添加
    a
    并从
    b
    中减去
    1
    ),直到
    b==0
    。这样对你来说可能更有意义:

    def mult(a, b):
        value = 0
        while b > 0:
            b = b - 1
            value = value + a
        return value
    
    只有在不使用while循环的情况下,函数才会不断地调用自身。我设法联系了mult本人,他愿意解释:

    嗨,我叫穆特,我是个递归者。递归器是一种常见的品种 在计算机科学中,我们有自己的特色;我们可以克隆 我们自己不幸的是,我被诅咒不能繁殖。不过,我 我想把我的梦想变成一个倍增器,我确实找到了一条路 去做吧。以下是方法:

    当你要求我繁殖
    (a,b)
    时,我会繁殖一个克隆 然后问他
    (a,b-1)
    。克隆将重复此过程,直到 生成一个被询问的克隆(
    a
    0
    )。当这种情况发生时 (有一行我自己+
    b
    克隆人),他回答 产生他的克隆人:
    0
    。那个克隆人反过来又给他想要的东西添加了一个
    a
    刚刚被告知(第一次是
    0+a
    )并回答了这个问题 他面前的克隆人。这个过程一直重复,直到我得到答案 在克隆人的帮助下,我生下了自己。我在上面加了一个
    a
    ,并将其作为最终结果返回 回答你


    此功能的基本逻辑是:

    让我们(添加
    a
    并从
    b
    中减去
    1
    ),直到
    b==0
    。这样对你来说可能更有意义:

    def mult(a, b):
        value = 0
        while b > 0:
            b = b - 1
            value = value + a
        return value
    
    只有在不使用while循环的情况下,函数才会不断地调用自身。我设法联系了mult本人,他愿意解释:

    嗨,我叫穆特,我是个递归者。递归器是一种常见的品种 在计算机科学中,我们有自己的特色;我们可以克隆 我们自己不幸的是,我被诅咒不能繁殖。不过,我 我想把我的梦想变成一个倍增器,我确实找到了一条路 去做吧。以下是方法:

    当你要求我繁殖
    (a,b)
    时,我会繁殖一个克隆 然后问他
    (a,b-1)
    。克隆将重复此过程,直到 生成一个被询问的克隆(
    a
    0
    )。当这种情况发生时 (有一行我自己+
    b
    克隆人),他回答 产生他的克隆人:
    0
    。那个克隆人反过来又给他想要的东西添加了一个
    a
    刚刚被告知(第一次是
    0+a
    )并回答了这个问题 他面前的克隆人。这个过程一直重复,直到我得到答案 在克隆人的帮助下,我生下了自己。我在上面加了一个
    a
    ,并将其作为最终结果返回 回答你


    你的逻辑在子弹5之前是正确的。然后在6点你跳过一些步骤。 这是一个递归函数。通过在纸上绘制事件树更容易理解,但让我们先恢复您的逻辑:

    mult(3,4):

    在上面的示例中,行开头的每个数字表示递归中的步骤。它从步骤1开始,一直到中的步骤5
    def mult(a, b):
        # Should I ask a clone?
        if b == 0:
            # No! I reply 0 to my asker.
            return 0
    
        # Yes! I spawn a clone and ask him (a, b - 1) and wait for an answer to
        # store in 'rest'
        rest = mult(a, b - 1)
    
        # I take the answer and add to it the 'a' I was told
        value = a + rest
    
        # I return the value I calculated to my asker
        return value
    
    print "3 * 2 = ", mult(3, 2)  # Here someone asks me (3, 2)
    
     1. a = 3, b = 4
     1. rest = mult(3, 3)
     2. a = 3, b = 3
     2. rest = mult(3, 2)
     3. a = 3, b = 2
     3. rest = mult(3, 1)
     4. a = 3, b = 1
     4. rest = mult(3, 0)
     5. a = 3, b = 0
     5. return 0
     4. value = 3 + 0
     4. return 3
     3. value = 3 + 3
     3. return 6
     2. value = 3 + 6
     2. return 9
     1. value = 3 + 9
     1. return 12
    
    COUNTER = 0
    
    def mult(a, b):
        global COUNTER
    
        COUNTER+=1
        print " "*COUNTER + "Called with", a,b
    
        if b == 0:
            return 0
        rest = mult(a, b - 1)
        value = a + rest
    
        COUNTER -= 1
        print " "*COUNTER, "Value:", value 
    
        return value
    
    print "3 * 4 = "
    print mult(3, 4)
    
    3 * 4 = 
     Called with 3 4
      Called with 3 3
       Called with 3 2
        Called with 3 1
         Called with 3 0
         Value: 3
        Value: 6
       Value: 9
      Value: 12
    12