谁能告诉我这个函数的递归部分是如何工作的?

时间:2014-11-16 17:21:59

标签: python function recursion

我已经获得了一个递归函数的例子,我只需要一些帮助来理解它。

我知道递归函数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的乘积,但我不确定函数的递归部分是如何工作的。

7 个答案:

答案 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时,您将执行以下操作:

  • 检查y是否为0,如果0为0则返回0.这是从递归返回所需的条件。
  • 如果它不为零,你会添加3 + fun(3,1)这部分进入堆栈并再次调用函数。
  • 再次检查y值并执行3 + func(3,0)。这部分再次进入堆栈并再次调用函数
  • 现在是0,所以它从堆栈中返回并弹出顶级元素,即3 + fun(3,0),现在因为fun(3,0)返回0将返回3
  • 再次弹出我们离开的顶部元素,即3 + fun(3,1)。上一步中的fun(3,1)返回3,所以它将3替换fun(3,1)并返回3 + 3 = 6。 - 既然你没有堆栈上的任何元素(即没有更多的功能评估),它返回6并返回给调用者。

答案 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)返回xy-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