百科狗-知识改变命运!
--

python函数递归

梵高11个月前 (11-21)阅读数 10#技术干货
文章标签递归

python函数递归:

在一个函数体内调用它自身,被称为函数递归。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。

例如有如下数学题。己知有一个数列:f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。这道题可以使用递归来求得。下面程序将定义一个fn()函数,用于计算f(10)的值。

deffn(n):

python函数递归

ifn==0:

return1

elifn==1:

return4

else:

#函数中调用它自身,就是函数递归

return2*fn(n-1)+fn(n-2)

#输出fn(10)的结果

print("fn(10)的结果是:",fn(10))

在上面的fn()函数体中再次调用了fn()函数,这就是函数递归。注意在fn()函数体中调用fn的形式:

return2*fn(n-1)+fn(n-2)

对于fn(10),即等于2*fn(9)+fn(8),其中fn(9)又等于2*fn(8)+fn(7)……依此类推,最终会计算到fn(2)等于2*fn(1)+fn(0),即fn(2)是可计算的,这样递归带来的隐式循环就有结束的时候,然后一路反算回去,最后就可以得到fn(10)的值。

仔细看上面递归的过程,当一个函数不断地调用它自身时,必须在某个时刻函数的返回值是确定的,即不再调用它自身:否则,这种递归就变成了无穷递归,类似于死循环。因此,在定义递归函数时有一条最重要的规定:递归一定要向已知方向进行。

例如,如果把上面数学题改为如此。己知有一个数列:f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。那么f(10)的函数体应该改为如下形式:

deffn(n):

ifn==20:

return1

elifn==21:

return4

else:

#函数中调用它自身,就是函数递归

returnfn(n+2)-2*fn(n+1)

从上面的fn()函数来看,当程序要计算fn(10)的值时,fn(10)等于fn(12)-2*fn(11),而fn(11)等于fn(13)-2*fn(12)……依此类推,直到fn(19)等于fn(21)-2*fn(20),此时就可以得到fn(19)的值,然后依次反算到fn(10)的值。这就是递归的重要规则:对于求fn(10)而言,如果fn(0)和fn(1)是已知的,则应该采用fn(n)=2*fn(n-1)+fn(n-2)的形式递归,因为小的一端已知;如果fn(20)和fn(21)是已知的,则应该采用fn(n)=fn(n+2)-2*fn(n+1)的形式递归,因为大的一端已知。

递归是非常有用的,例如程序希望遍历某个路径下的所有文件,但这个路径下的文件夹的深度是未知的,那么就可以使用递归来实现这个需求。系统可定义一个函数,该函数接收一个文件路径作为参数,该函数可遍历出当前路径下的所有文件和文件路径,即在该函数的函数体中再次调用函数自身来处理该路径下的所有文件路径。

总之,只要在一个函数的函数体中调用了函数自身,就是函数递归。递归一定要向已知方向进行。

以上内容为大家介绍了Python培训之函数递归,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:开发教育。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)