Python的尾递归优化

今天在刷算法时,遇到尾递归的概念,之前也看到过,但是没有深究,只知道尾递归效率高。今天学习了一下.

什么是尾递归:

尾递归的定义很简洁: 递归语句是函数的最后一条语句

为什么高效?

我们知道操作系统使用堆栈来处理递归,对于一般的递归,操作系统要在堆栈上新建一个栈帧来存储当前调用函数的数据,比如局部变量、现场信息、返回地址等。每递归一次就新建一个栈帧,压到栈顶。如果处理很深的递归或函数处理数据很大时,很有可能造成栈溢出。
而对于尾递归,编译器会作出一些优化。即若编译器发现这次递归是尾递归,它不会去新建一个栈帧,而是用当前函数的信息覆盖掉栈顶栈帧中的信息。之所以能这么做是因为递归语句位于函数的最后,前面的计算工作都已经完成了,不用保存中间结果。这样一来省去了创建栈帧的开销;二来避免了栈溢出。

程序测试

Snip20181017_3.png

上图两个阶乘函数,第一个不是尾递归,第二个是尾递归。计算10!,二者差了0.00002s。如果计算量很大时,差异可能就会明显起来。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容