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 相关文章推荐
简单的Python抓taobao图片爬虫
Oct 26 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
python查看微信好友是否删除自己
Dec 19 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
python 判断网络连通的实现方法
Apr 22 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
python文件和文件夹复制函数
Feb 07 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 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&amp;&amp;mysql)二
2006/10/09 PHP
PHP XML数据解析代码
2010/05/26 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
微信小程序url传参写变量的方法
2018/08/09 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
税务干部鉴定材料
2014/02/11 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
自荐信格式模板
2015/03/27 职场文书
起诉书范文
2015/05/20 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript