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 相关文章推荐
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python中 Lambda表达式全面解析
Nov 28 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
Python实现对adb命令封装
Mar 06 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
python对接ihuyi实现短信验证码发送
May 10 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 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和.net的区别
2014/09/28 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
原生JS实现留言板
2020/03/26 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
Python实现简易Web爬虫详解
2018/01/03 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
Python常用库大全及简要说明
2020/01/17 Python
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
编辑硕士自荐信范文
2013/11/27 职场文书
毕业生个人求职信范例分享
2013/12/17 职场文书
晚会主持词开场白
2014/03/17 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
公司催款律师函
2015/05/27 职场文书
未婚证明范本
2015/06/15 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技