我对python课程中提供的某些python代码有疑问

时间:2019-08-11 19:03:44

标签: python recursion

从我正在学习的课程中看,代码是简单的递归,但是我无法理解的是......在运行代码时,如何将a添加到a中?第2行的print语句针对每个计数显示a = 4,但返回a时,它等于24

我尝试将打印语句放置在不同的位置,以查看为什么变量“ a”被添加到“ a”但没有运气。为什么只有三个变量a被添加到a

def mult(a,b,c):

   print ('a =',a, ' b =',b, ' c = ',c)
   print(' ')
   if b == 1:
       return a
   else:
      c += 1

return a + mult(a, b-1, c)

a=4
b=6
c=0
x=mult(a,b,c)
print("a*b = ",x)

代码可以正确运行,但不确定为什么。

5 个答案:

答案 0 :(得分:1)

仅在a时返回b == 1。当b == 2时,它返回a + mult(a, 1, c) == a + a。当b == 3时,它返回a + mult(a, 2, c) == a + (a + a),等等。

(请注意,c根本不影响返回值;其唯一目的是计算递归的深度。您应注意,b + c的值在整个过程中保持不变;每将c加1,就会从1中减去b。)

答案 1 :(得分:1)

按照书面规定,您并未使用c,因此可以将其重写为:

def mult(a,b):

    print('a =',a, ' b =',b)
    print()
    if b == 1:
        return a
    else:
        return a + mult(a, b-1)

a=4

b=6

x=mult(a,b)

print("a*b = ",x)

最好的办法是手动扩展正在发生的事情。在这种情况下, mult()被重复调用。因此,对于a = 4和b = 6,展开 通话,您最终会得到:

mult(4, 6) => 4 + mult(4, 5)
           => 4 + 4 + mult(4, 4)
           => 4 + 4 + 4 + mult(4, 3)
           => 4 + 4 + 4 + 4 + mult(4, 2)
           => 4 + 4 + 4 + 4 + 4 + mult(4, 1)
           => 4 + 4 + 4 + 4 + 4 + 4
           => 24

答案 2 :(得分:0)

如您所见,此功能永远不会更改a。但是,它返回a + mult(a, b-1, c),而这正是a被添加到amult(a, 2, c)的返回值)的地方,所以也难怪它可能返回与{ {1}}。

答案 3 :(得分:0)

这似乎是正确的行为。让我演示一下您的示例,但数字较小。

a=2
b=2
c=0

第一次迭代:b不是1,所以重拍mult(2,1,1)

第二次迭代:b为1,因此返回a(返回2)

现在我们返回上一个堆栈,我们需要返回一个2 + mult(2,1,1)的结果,该结果也是4,我们得到8。

尝试将这个逻辑应用于您的示例,您将发现它对于始终为4并最终返回24来说确实很有意义。

答案 4 :(得分:0)

在每次递归中,都不会添加allow,它会被调用,然后再次被调用...

直到mult(a, b-1, c)为止,它只会返回b == 1

基本上,a第一次运行时,它将调用:

mult

,当它运行时,它将调用:

mult(4, 6 - 1, 1)

,当它运行时,它将调用:

mult(4, 5 - 1, 2)

,当它运行时,它将调用:

mult(4, 4 - 1, 3)

,当它运行时,它将调用:

mult(4, 3 - 1, 4)

最后,当运行此命令时,mult(4, 2 - 1, 5) 最终将等于b并返回1

因此,a返回mult(4, 2 - 1, 5)

然后a返回mult(4, 3 - 1, 4)

然后a + (a)返回mult(4, 4 - 1, 3)

然后a + (a + (a))返回mult(4, 5 - 1, 2)

然后a + (a + (a + (a)))返回mult(4, 6 - 1, 1)

最后,最初调用的a + (a + (a + (a + (a))))将返回mult(4, 6, 0)

基本上等于a的6倍,等于24。但是a + (a + (a + (a + (a + (a)))))的值从未改变。