不应该';这个Python函数是否总是返回6?
我是Python新手,学习函数。我遇到了下面的函数,我完全理解它是如何工作的。在我看来,无论不应该';这个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。按
b
的值是多少,答案都应该是6,但事实并非如此
代码
我对所发生事情的理解
b
不是0,所以它继续rest
被分配值3,1
,并再次运行该函数b
是1并且不等于0,所以它继续执行rest
rest
被分配值3,0
,并再次运行该函数b
现在为零,因此返回值0value
,其值为3+3,因为a
的值为3,rest
的值为3,即(3,0)
mult(3,4)
,它将返回值12。按照我的理解,这是不可能的。显然,我不理解逻辑流程。我做错了什么
mult()
用3,2
调用(这是调用#1)3,1
调用mult()
(这是调用#2)3,0
调用mult()
(这是调用#3)b
为零)调用#2a
值增加a
,递归地深入到istelfb
次。因此,将3自身加4次将得到12
mult()
用3,2
调用(这是调用#1)3,1
调用mult()
(这是调用#2)3,0
调用mult()
(这是调用#3)b
为零)调用#2基本上,每次调用都会将
a
值增加a
,递归地深入到istelfb
次。因此,将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