Python进阶之尾递归的用法实例


Posted in Python onJanuary 31, 2018

作者是一名沉迷于Python无法自拔的蛇友,为提高水平,把Python的重点和有趣的实例发在简书上。

尾递归

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。

(来源于不说人话的某度)

下面是笔者的个人理解:把计算出的值存在函数内部(当然不止尾递归)是其计算方法,从而不用在栈中去创建一个新的,这样就大大节省了空间。函数调用中最后返回的结果是单纯的递归函数调用(或返回结果)就是尾递归。

实例

实例还是和笔者的上一篇文章相同,建议读者阅读 Python —— 递归

1、阶乘

常规递归阶乘:

def factorial(n): 
  if n == 0:
    return 1
  return factorial(n - 1) * n

我们来看一下执行过程:

factorial(4) 
factorial(3) * 4 
factorial(2) * 3 * 4 
factorial(1) * 2 * 3 * 4 
factorial(0) * 1 * 2 * 3 * 4 
1 * 1 * 2 * 3 * 4 
1 * 2 * 3 * 4 
2 * 3 * 4 
6 * 4 
24

但是如果把上面的函数写成如下形式:

def factorial(n, acc=1): 
  if n == 0:
    return acc
  return factorial(n - 1, n * acc)

我们再看下执行过程:

factorial(4, 1) 
factorial(3, 4) 
factorial(2, 12) 
factorial(1, 24) 
factorial(0, 24) 
24

很直观的就可以看出,这次的 factorial 函数在递归调用的时候不会产生一系列逐渐增多的中间变量了,而是将状态保存在 acc 这个变量中。而这种形式的递归,就叫做尾递归。

2、斐波那契数列

常规递斐波那契数列:

def fib(n):
  if n < 2:
    return n
  else:
    return fib(n - 1) + fib(n - 2)

而尾递归:

def fib_tail(n, r, t):
  if n == 1:
    return r
  else:
    return fib_tail(n - 1, t, r + t)

一下子就充满了逼格,还高效了许多,何乐而不为呢!

总结

可以看出,在每次递归调用的时候,都会产生一个临时变量,导致进程内存占用量增大一些。这样执行一些递归层数比较深的代码时,除了无谓的内存浪费,还有可能导致著名的堆栈溢出错误。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
使用Python编写vim插件的简单示例
Apr 17 Python
Python文件读取的3种方法及路径转义
Jun 21 Python
深入解析Python中的变量和赋值运算符
Oct 12 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
儿童学习python的一些小技巧
May 27 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
python使用正则来处理各种匹配问题
Dec 22 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
Python Pygame实战之塔防游戏的实现
Mar 17 Python
Django框架中视图的用法
Jun 10 Python
简单的python协同过滤程序实例代码
Jan 31 #Python
Python进阶之递归函数的用法及其示例
Jan 31 #Python
Python tkinter事件高级用法实例
Jan 31 #Python
pyqt5自定义信号实例解析
Jan 31 #Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 #Python
pyqt5简介及安装方法介绍
Jan 31 #Python
Python实现的圆形绘制(画圆)示例
Jan 31 #Python
You might like
十天学会php(3)
2006/10/09 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
js 学习笔记(三)
2009/12/29 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
教你安装python Django(图文)
2013/11/04 Python
浅析Python中的多重继承
2015/04/28 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python线性回归实战分析
2018/02/01 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
会计出纳岗位职责
2013/12/25 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
银行进社区活动总结
2014/07/07 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技