Python递归函数

Python递归函数的运用 什么是递归函数? 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 意义:通过一定的“基”,并按照某种规则达到重复的效果 递归函数实现斐波那契数列 斐波那契数列的定义: 斐波那契数列指的是这样一个数列 : 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,... 阅读详情

Python递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:

fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n

所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:

def fact(n):

if n==1:

return 1

return n * fact(n - 1)

上面就是一个递归函数。可以试试:

>>> fact(1)

1

>>> fact(5)

120

>>> fact(100)

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

如果我们计算fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000):

>>> fact(1000)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 4, in fact

...

File "<stdin>", line 4, in fact

RuntimeError: maximum recursion depth exceeded

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。微点阅读(www.weidianyuedu.com

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

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

def fact(n):

return fact_iter(n, 1)

def fact_iter(num, product):

if num == 1:

return product

return fact_iter(num - 1, num * product)

可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1和num * product在函数调用前就会被计算,不影响函数调用。

fact(5)对应的fact_iter(5, 1)的调用如下:

===> fact_iter(5, 1)

===> fact_iter(4, 5)

===> fact_iter(3, 20)

===> fact_iter(2, 60)

===> fact_iter(1, 120)

===> 120

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

小结

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。

Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

来源:https://www.weidianyuedu.com

Python|递归函数之斐波那契数列 欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。欢迎加入团队圈子!与作者面对面!直接点击!上一期小编主要... 阅读详情

相关推荐

Labview邪修01:贪吃蛇小游戏

摘要:博主使用LabVIEW 2020(32位)复刻了经典贪吃蛇游戏。程序具备随机生成蛇(初始长度3)和食物、三档速度调节、键盘方向控制等功能,碰撞边界或自身即游戏结束。实现过程包括:1)界面设计,使用二维颜色盒数组构建游戏区,添加速度枚举控件和功能按钮;2)程序架构,采用模块化设计包含Main.vi、Start.vi等6个核心VI,分别处理初始化、位置计算、碰撞检测等逻辑;3)事件驱动机制,通过开始/结束事件、按键响应和超时循环实现游戏流程控制。运行时可实时显示分数,完整还原了贪吃蛇的核心玩法。

weixin_38637405的博客 922

Python 递归函数

递归函数 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数递归函数特性: 必须有一个明确的结束条件; 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实...

一起学习 10万+

【WRF-Chem教程-附录 C】闪电-NOx 参数化方案详解

闪电-NOx 参数化方案详解

WW、forever的博客 960

python编写递归函数_[ python ] 递归函数

递归函数描述:如果一个函数在内部调用自身本身,这个函数就是递归函数递归函数特性:(1)必须有一个明确的结束条件(2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少(3)相邻两次重复之间有紧密的联系,前一次要为后一次做准备(4)递归效率不高,递归层次过多会导致溢出首先,我们可以从字面上来理解递归函数递:传递出去的意思归:回来的意思递归函数就是一个有去有回的过程,以下一个简单的例子来解释递归...

weixin_39687881的博客 2447

python递归函数定义_Python 递归函数

Python--递归函数一. 描述1.编程语言中, 函数Func(Type a,......)直接或间接调用函数本身,则该函数称为递归函数.2.在数学上,关于递归函数的定义如下: 对于某一函数f(x), 其定义域是集合A, 那么若对于A集合中的某一个值x0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数.3.递归的定义:一种计算过程, 如果其中每一步都要用到前一步或前几步的结...

weixin_39705069的博客 793

python递归函数详解

等等都是一类递归函数,但是我们知道,它们在实现过程中需要执行多次,并且执行完第一次之后就不能再执行第二次了。也就是说,当我们在调用完递归函数之后(这里就不需要调用B了),C还会再执行一遍递归函数A。然后,我们再把一个递归函数套入到另一个程序中,这样,我们就可以在另外一个程序中直接调用这个递归函数了。当然,对于递归函数来说,最重要的一点是,在调用了递归函数之后,我们应该把函数的参数传递给另一个函数。我们可以看到,这是一个循环,而我们在第一次执行的时候,都是需要调用 printf ()函数的。

花生日记 4609

python递归函数的实例_Python 递归函数详解及实例

Python 递归函数详解及实例这篇文章主要介绍了 Python 递归函数详解及实例的相关资料, 需要的朋友可以参考下Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++...

weixin_32064437的博客 676

Python递归函数

递归函数递归函数:自己调用自己的函数,在函数体内直接或间接的自己调自己。 #测试递归函数的基本原理。 #test01调test02不会出错,调自己会出现死循环,直到栈满出错。 def test01(): print("test01") test02() def test02(): print("test02") test01() 【结果】 test01 test02 ​ 递归类似于数学中的“数学归纳法”。每个递归函数必须包含两个部分: 1、终止条件 ​ 表示递归函数

tuhutuo8866的博客 1015

python递归函数定义_python递归函数

python递归函数一、递归函数定义什么是递归: 在一个函数里在调用这个函数本身最大递归层数是:997最大递归层数可以修改,建议不要去修改 (如果997层数递归都没解决你的问题那只有两个原因:一、你的代码不适合用递归,二、你的代码太烂~)def foo(n):print(n)n+=1foo(n)foo(1)结果如下:报错不用管992993994995996Traceback (most rec...

weixin_39982269的博客 667

[转载] 递归函数python基例_python递归函数详解 python 递归函数使用装饰器

参考链接: Python递归 移动宽带检查显示 CRM,radius状态不一致是怎么回事啊?您可以把电信宽带猫等设备重启试一下,如果仍然不行,可以拨打10000号请工作人员帮您查看、处理。 电信宽带诊断显示AAA带宽寓CRM带宽不一致。 Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能CSS布局HTML小编今天和大家分享解的,一般来说是问题的最小规模下的解。 例如:斐波那契数列递归,f(n) = f(n-1) ...

u013946150的博客 400

Python递归函数

递归函数定义 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 例子 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times nfact(n)=n!=1×2×3×⋅⋅⋅×(n−1)×n=(n−1)!×n=fact(n

superw的博客 338

python 递归函数详解

在我们前面的文章中,我们介绍了一些简单的递归函数,比如循环、递归,还有递归分解等等,在本文中我们会继续介绍一些更复杂的递归函数,比如递归分解。在 python中,有一种非常神奇的函数:递归函数,它可以让你的程序实现自顶向下的递归调用,从而实现程序的无限循环。递归程序是一种特殊的程序,它不是从某个具体的点开始执行,而是从一个很小的点开始执行,然后返回这个点的值。3.在 python中,递归函数是一种非常强大的功能,如果你有需要,可以使用它来实现一些非常强大的功能。当子函数返回新的值时,递归就结束了。

花生日记 1691

Python函数之六:递归函数

Python函数之六:递归函数 一、什么是函数的递归 1、编程语言中, 函数Func(Type a,…)直接或间接调用函数本身,则该函数称为递归函数。 2、递归的定义:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归。 3、用递归过程定义的函数, 称为递归函数。 1、直接调用和间接调用 1.1 直接调用 def func(): print('in func') func() func() 分析:这就是一个直接调用的 1.2 间接调用 ...

qq_35092730的博客 6542

Python递归函数的理解与算法详解

递归函数 递归函数递归函数1、递归的概念2、借助动图理解递归3、计算n的阶乘1.用循环来计算阶乘2.递归函数如何计算n的阶乘4、如何理解递归函数的return5、简单代码协助理解递归函数,以及经典return过程中的错误#!/usr/bin/python3 1、递归的概念 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当...

chenpeng971019的博客 4175

python 递归函数

python里面也可以使用递归函数,所谓递归函数就是利用函数本身调用自身,然后一直不停地调用自身,达到合适的条件,然后返回计算后的值。 例如:#计算5的以内的加法           def add(j):                if j==0:                     return 0               return j+add(j-1)      

Yulock的博客 5729

python递归函数讲解_Python递归函数实例讲解

Python递归函数实例1、打开Python开发工具IDLE,新建‘递归.py'文件,并写代码如下:def digui(n):if n == 0 :print ('')returnprint ('*'*n)digui(n-1)if __name__ == '__main__':digui(5)这里递归打印*号,先打印后递归2、F5运行程序,打印内容如下;***************3、更改一下打...

weixin_39940788的博客 186

python代码递归函数_Python递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n所以,fact(n)可以表示为 n * fact(n-1),...

weixin_39872257的博客 257

python递归函数基例_讲解Python中的递归函数 python 递归函数 哪个课讲的好

Python 递归函数基例2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能分享解的,一般来说是问题的最小规模下的解。 例如:斐波那契数列递归,f(n) = f(n-1) + f(n-2),基例是1和2,f(1)和f(2)结果都是1 再比如:汉诺塔递归,基例就是1个盘子的情况,只需移动一次。在Python 中怎样让一个递归函数返回此函数的总递归def...

weixin_39941732的博客 230

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

YOLOv8 Visdrone航拍目标识别项目代码项目详细介绍请看链接:https://blog.csdn.net/qq_53332949/article/details/144630165数据集详细介绍请看:https://blog.csdn.net/qq_53332949/article/details/141462912数据集下载请看:https://download.csdn.net/download/qq_53332949/89713919?spm=1001.2101.3001.9500按文件中requirements.txt文件配置环境即可使用。

上一篇: Linux系统下MySQL如何每天定时备份
下一篇: PHP常用的缓存技术
hdxx2022
博客等级 码龄4年 1428粉丝 · 1559原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值