python静态递归函数_Python递归函数相关

函数中调用其他函数是解决实际问题中常用方法,递归函数便是函数在运行过程中调用自身的函数。它像是循环的另一种表达方式,不过相较于写循环,递归函数封装性较好、可读性较强。在解决一些循环问题时,使用递归函数往往更简洁有效。以往提到递归函数时,理解仅仅到它比循环更简洁。今天读了博主程序员的人生A的博客后,学习到递归函数的调用机制以及通过尾递归优化解决栈溢出的问题,特留随笔,作温习记录用。

首先递归函数的调用是通过栈(stack)这一种数据结构实现,每多一次函数调用/返回,栈就增加/减少一层栈帧。既然提到它,不妨大致复习一下堆栈的相关。提栈就不得不提它的两个操作及一个性质:入栈(PUSH)和出栈(POP),他们按照先入后出、后入先出的顺序操作。进栈出栈就像往一个盒子里取放东西,先放的被后放的压在下面,要想取到下面的,自然要先拿出在上面的。栈之所以于程序有着至关重要的作用,是因为栈保存了一个程序调用时所需的维护信息,称为堆栈帧或活动记录。它一般包含几部分:1、函数的返回地址和参数;2、临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。堆栈的实质是一种运算受限于一端的线性表。那既然是线性表,大小自然是有限的。因此,当递归函数调用次数过大(即参数过大时),便会出现“栈溢出”的现象。

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

用最简单的阶乘函数举例。

使用循环计算1*2*3*...*n:

n = int(input("输出一个数:"))

if n == 0:

sum = 0

else:

sum = 1

for i in range(1,n+1):

sum *= i

print("它的阶乘为:",sum)

使用递归函数计算:

def recursion(n):

if n==1:

return 1

return n * recursion(n - 1)

a = int(input("输入一个数:"))

print("它的阶乘为:", recursion(a))

但当a过大时,编译器便会因栈溢出而报错,这是就需要用到尾递归优化。

尾递归优化:

def recursion(n):

return fact_iter(n, 1)

def fact_iter(num, product):

if num == 1:

return product

return fact_iter(num - 1, num * product)

优化后,函数仅返回递归函数本身,这样栈帧中数据每一次使用后更新,栈不再增长,无论调用多少次都不会导致栈溢出。遗憾的是python解释器并没有针对尾递归做优化,因此用python时即使进行了尾递归优化,还是会导致栈溢出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wlan端口服务器无响应,wlan项目遇到的问题,总结

现在我使用的设备都是Aruba MSR,MSA系列产品debug dhcp调试DHCP协商过程若AP能够不能正常获得IP地址,可能是ONU、OLT核心网的问题通过查找,排错调试过程是:AP能够发送DHCPdiscoverAC响应AP,发送DHCPoffer正常情况下,AP…

extjs 月份选择控件_ExtJs日期控件案例(可控制时间的选择) | 学步园

图片效果:ExtJs代码:/* *********************************************************************日期控件的简单案例*****************************************************************************************************************************…

风之大陆 服务器不稳定,《风之大陆》手游官网——异世界奇幻冒险MMO手游

勇敢的守护者:为给您提供更好的游戏体验,游戏服务器将于2021年5月20日6:00起进行更新维护本次更新维护预计需要60分钟,根据维护进度可能提前或延迟开服。在服务器维护期间,您将无法登入游戏,请您及时下线,以…

catia测量工具小尺子在哪_小区垃圾桶旁捡来旧茶几,老爸巧手改成沙发,邻居一个劲问哪买的...

前几天老爸在小区垃圾桶旁边捡回来一个旧茶几,又脏又破都掉漆了,捡回来用不了还占地方,他却非说要动手将它改成个小沙发。那么麻烦还不如直接买一个,但最后改出来的效果还不错,关键是便宜,不到50块钱比定制…

numpy创建三维空数组_numpy数组的创建和属性转换

一、数据与numpy数组的创建1、 python数组的创建python中的固定类型数组:python中提供了几种将数组存储在有效的、固定类型的数据缓存中的选项。内置的数组(array)模块可以创建按统一类型的密集数组:这里的“i”表示的是一个数据类…

各类木材强度_凯狄解析各类抽芯铆钉的工作原理

开口型抽芯铆钉:铆钉铆接后,钉芯在钉芯头与钉芯杆交接处或其附近断裂,钉芯头和一小部分钉芯杆留在铆钉体中。其抗剪强度类似于空心铆钉连接。封闭型抽芯铆钉:铆钉铆接后仍保持封闭的铆钉体。在铆钉体与被连接件的接触面之间采取密…

ppt流程图字体太小_简单三步,用WPS轻松完成一个又大气又好看的流程图!

点击蓝字 关注我们流程图是工作中经常需要用到的图形,使用 WPS 可以方便地创建流程图。创建的流程图保存在云文档后,可以随时插入 WPS 的其他组件。新建流程图文件流程图可以从 WPS 的其他组件中创建,如 WPS 文字、WPS 表格等,也可…

class传参 python_Python类的概念、定义、属性、继承

1.面向对象(Object Oriented,OO)概念面向对象,是我们编程的一种思维。早期的计算机编程是基于面向过程的方法,例如实现算术运算112 4,通过设计一个算法就可以解决当时的问题。随着计算机技术的不断提高,计算机被用于解决越来越复…

4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键

按键是一种常开型按钮开关,与单片机的常见接法如图所示。按键未按下时两个触点断开,单片机I/O口输入高电平;当按键闭合时,I/O口输入低电平。一、按键讲解当I/O口为P0口时,由于没有内部上拉电阻,所以必须外接…

android给数组添加新元素_重磅!超详细的 JS 数组方法整理出来了

作者:Yushiahttps://juejin.cn/post/6907109642917117965数组是 js 中最常用到的数据集合,其内置的方法有很多,熟练掌握这些方法,可以有效的提高我们的工作效率,同时对我们的代码质量也是有很大影响。一、创建数组1.使…

小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...

你这么优秀,一定只想把“柠檬班”置顶▲→性能3期优秀作业利用lr的java vuser协议完成(登录,md5加密完成重置支付密码,获取订单列表)请求,并加if判断完善脚本本文由柠檬班性能3期学员eleven根据作业原创出品。1工作准备jdk版本的选…

发动机压缩比怎么计算公式_2020沃德十佳发动机出炉:这三款机头,20万内就能买到...

引言 | 内燃机最后的巅峰?《Wards Auto World》每年都会发布沃德十佳发动机榜单,2020年度的榜单早在去年底已经出炉,但小编觉得仍有可讲之处。考虑到老美特殊的驾驶环境,地广人稀,基础设施齐全,人工费奇高&…

计算ln_钢筋工程算量培训-钢筋工程量计算公式

框架梁一首跨钢筋的计算1、上部贯通筋上部贯通筋(上通长筋1)长度=通跨净跨长+首尾端支座锚固值2、端支座负筋端支座负筋长度:第一排为Ln/3+端支座锚固值;第二排为Ln/4+端支座锚固值3…

智能照明控制系统电路图_咻享智能|学校教室智能照明控制系统怎么理解

教室是学校照明用电的主要部分。教室灯光照度设计标准为室内平均照度300 lx,这样高的照度要求,如果没有合理控制方案,能源上将造成巨大的浪费。因此将智能照明控制系统应用于普通教室、阶梯教室具有相当的实际意义。对于学校而言,…

redis关键字删除_微信公众号文章防删除

阅读本文大概需要 3.6 分钟。前段时间《一个出身寒门的状元之死》刷屏了,当我看完了这篇文章,很有感触,一开始我以为是事实,后来才发现完全是虚构,对于我来讲并不是非常在乎文章中的故事是否是真实的,我在乎…

java单链表节点翻转_Java数据结构01-链表基础(讲解+代码+面试题)

文章结构链表的概念/用处链表的基本代码实现(韩顺平Java数据结构网课)剑指offer上链表题目代码实现(个人手敲,更精巧的答案可以参考官网)链表链表包含单链表,双向链表,循环链表等等。相对于线性…

分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...

*例7:在等式35( )8127718( )162的两个括号中,填上适当的最小的数。(适于六年级程度)解:将已知等式的两边分解质因数,得:5377( )22367( )把上面的等式化简,得:15( )4( )所以&a…

即席和即兴_即兴说话小课堂

即 兴 说 话 小 课 堂了解发音的小知识,运用语言技巧,通过音色、音强,来达到的一种发音。发音的能力,更重要的是提高自己的普通话水平,锻炼自己的综合能力。师兄的课堂是非常难得,大家一起来学习吧&a…

云片短信php接口_php与阿里云短信接口接入

使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证官方审核多次,尤其审核需要保持耐心。1. accessKeyId 相当于你的个人账户密钥;2. accessKeySecret 与上是成对的;3. SignName 个人签名&#xff…

读中文_校友分享预告 | 在港中文读物理是什么体验?理科就业转商科有何经验心得?...

留学分享会总第233期港新地区校友分享实录商科《19年入读港大金融师姐带来最新香港就读体验与求职经验》《在香港大学读金融是怎样一种体验?》《在香港大学读会计是怎样一种体验?》《在香港大学读商业分析是怎样一种体验?》《在新加坡国立大学…