我已经获得了一个递归函数的例子,我只需要一些帮助来理解它。
我知道递归函数a)必须有一个基本情况,b)必须改变参数并转向基本情况并且c)必须自己调用
代码如下:
def func(x,y):
if y == 0:
return 0
else:
return x + func(x,y-1)
我只是在努力去理解func(x,y-1)。我知道函数返回x和y的乘积,但我不确定函数的递归部分是如何工作的。
答案 0 :(得分:1)
你的函数每次都会减少y
的值,直到0
为止,然后在每次调用中你都保持x
所以取决于y
你拥有的值x
y*x
实际上函数的总和为>>> def func(x,y):
... if y == 0:
... return 0
... else:
... return x + func(x,y-1)
...
>>> func(3,4)
12
>>> func(3,0)
0
func(3,4)
例如 3 + func(3,3)= 3+ func(3,2) = 3 + func(3,1) = 3 + func(3,0)= 3+0
你的函数返回:
func
如果我们替换3+(3+(3+(3+0)))
,我们会12
等于{{1}}。
答案 1 :(得分:0)
此函数正在添加x元素y次。所以这里是如何运作的:
当您使用3,2来调用您的func时,您将执行以下操作:
答案 2 :(得分:0)
func(x,y-1)只需用新值x& Y-1 例如, 取x = 5,y = 6 第一个电话会是:func(5,6) 之后,它会调用 func(5,5) - > func(5,4) - > func(5,3) - > func(5,2) - > func(5,1) - > FUNC(5,0)强>
最后func(5,0)将返回0给它的调用者。 &安培;它会一路走到第一个电话......
简而言之,每次该函数重复出现时,它都会用一个较小的y值(即第二个变量)来调用它自己。最终当y = 0时终止。
答案 3 :(得分:0)
我们假设func
是一个返回其两个参数的乘积的函数(假设y
是一个非负整数)。当y
为0时,它显然是正确的,因为
if y == 0:
return 0
对于x * 0
的任何值,和x
为0。否则,它返回
x + func(x, y-1)
,由于我们假设func(x, y-1)
返回x
和y-1
的产品,我们可以确认
x + x*(y-1) = x + x*y - x
= x*y
所以func(x, y)
确实会为x * y
和任何非负整数x
返回y
。
我的大学教授用来告诉我们相信你的递归"。在进行递归调用时,只需假设递归调用将返回"正确的事情"在编写递归案例时;只要你正确地进行递归调用"更简单"比起原来的电话,它只会工作"。
答案 4 :(得分:0)
正如你所说,该功能一直在调用自己。如果它是这样的:
def func(x,y):
return func(x,y)
它无休止地自称,不会给你一个结果。
但是,如果你在每次通话时减小y,你可以在某些时候停止“疯狂”,例如:当y达到零。然后,如果y每次小1,则func(2,2)将调用func(2,1),这将调用func(2,0),最终将返回一个值,因为那时y = 0。 func(2,1)使用该值并向其添加“x”,依此类推。最后,func(2,2)会将x添加到该返回值。然后返回x次y函数调用或2 * 2.
答案 5 :(得分:0)
我还应该说应该完成以下优化:if y == 0 or x == 0:
,或者调用func(0, 1000)
会不必要地将值放入堆栈
答案 6 :(得分:0)
计算机程序的结构和解释(SICP)将迭代过程描述为“随身携带”解决问题所需的所有信息,而递归过程必须“记住它来自哪里”才能解决问题。
一种看待区别的方法是追踪问题的长度如何增长,然后在解决问题时缩小。
def func(x,y):
if y == 0:
return 0
else:
return x + func(x,y-1)
func(5,4)
func(5,4) --> 5 + func(5,3)
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2)
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2) -- > 5 + func(5,1)
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2) -- > 5 + func(5,1) --> 5 + func(5,0)
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2) -- > 5 + func(5,1) --> 5 + func(5,0) --> 0
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2) -- > 5 + func(5,1) --> 5 + 0
func(5,4) --> 5 + func(5,3) --> 5 + func(f,2) -- > 5 + 5
func(5,4) --> 5 + func(5,3) --> 5 + 5 + 5
func(5,4) --> 5 + 5 + 5 + 5
5 + 5 + 5 + 5
20