从我正在学习的课程中看,代码是简单的递归,但是我无法理解的是......在运行代码时,如何将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)
代码可以正确运行,但不确定为什么。
答案 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
被添加到a
(mult(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)))))
的值从未改变。