博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 递归调用
阅读量:6939 次
发布时间:2019-06-27

本文共 580 字,大约阅读时间需要 1 分钟。

hot3.png

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

def fact(n):    return fact_iter(n, 1)def fact_iter(num, product):    if num == 1:        return product    return fact_iter(num - 1, num * product)

可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1num * product在函数调用前就会被计算,不影响函数调用。

fact(5)对应的fact_iter(5, 1)的调用如下:

转载于:https://my.oschina.net/u/3055388/blog/862651

你可能感兴趣的文章
SQL Server中的锁类型及用法(转载)
查看>>
CodeVS 1008 选数(DFS)
查看>>
SQL Server日常积累
查看>>
C++强制类型转换
查看>>
搭建FTP服务器 window7
查看>>
并发编程下的性能定律(翻译)
查看>>
cssText文本格式化
查看>>
新建koa2项目
查看>>
Phoenix 索引生命周期
查看>>
I,P,B帧和PTS,DTS的关系
查看>>
JavaOO练习:违规管理系统
查看>>
继续开始列车式的生活
查看>>
String的属性和方法
查看>>
hdu-1800
查看>>
读写锁-锁粒度
查看>>
C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象
查看>>
java.net.BindException: 权限不够
查看>>
《c程序设计语言》读书笔记-字符型0-9转为数字0-9
查看>>
公务员队伍开始动荡了吗?
查看>>
项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)
查看>>