0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是Python的递归函数

汽车电子技术 来源:安迪python学习笔记 作者:安迪python学习笔记 2023-02-23 10:25 次阅读
  • 1.递归的形象解释
  • 2.定义
  • 3.步骤
  • 4.终止条件
  • 5.优点
  • 6.缺点
  • 7.调用深度
  • 8.课堂实例
  • 9.计算n的阶乘
    • 9.1什么是阶乘
    • 9.2计算5!

1.递归的形象解释

我们首先看一段视频,来形象理解什么是递归。

视频作者:pipi的奇思妙想

大家可以网上搜一下该作者的视频,搜不到的可以联系我!

【目标任务】

电影院里,小玩偶想知道自己的位置在第几排。

2.定义

一个函数是可以调用另一函数的。

作为特例,如果一个函数调用了自己,那我们称这个函数为递归函数。

【示例】

f(x)=f(x+1)+x

f(x)和f(x+1)的函数名都是f,只是参数不同,一个是x,一个是x+1。

像这样自己调用自己的表达式就是一个递归函数。

3.步骤

递归通常可以分为两步:先递后回归。

视频中的小玩偶从后往前询问前一个小玩偶的坐位数,就是一个递推的过程。

小玩偶从前往后告诉后一个小玩偶的它座位数,就是一个回归的过程。

4.终止条件

递归函数必须有终止条件。

编程中,函数的调用要占用名叫栈(stack)的内存空间。

调用函数时,程序会将相关的数据存储到计算机的栈里。

当函数运行结束时数据会从栈里取出。

如果函数调用永远不停止,栈会被塞满,数据就没地方存储。

我们将这种情况称为栈溢出。

栈溢出,程序会被操作系统强行终止。

因此,递归函数必须有终止条件。

5.优点

递归函数自己调用自己,代码相对简单。

6.缺点

递归函数每调用一次都会开相应的内存空间,因此递归函数的缺点就是占用内存较多。

7.调用深度

递归调用的次数,我们称之为调用深度。

递归函数调用深度是有限制的,超出会有溢出。

8.课堂实例

我们用一个简单的例子来体验递归函数:

def f(x) :    
    return f(x-1)+x          
print(f(3))

【代码解析】

  1. 定义函数f,参数是x,注意自定义函数语句以英文冒号:结尾;
  2. 自定义函数要实现的功能是:返回f(x-1)+x

f(x)和f(x-1)函数名相同,只是参数不同。

因此,在自定义函数f(x)中,它自己调用了自己。

  1. 最后是调用函数,调用函数的语法为函数名(参数)

这里的函数名是f,要传入的实际参数为3。

【参数传递过程】

当参数等于3的时候,函数的返回值是f(2)+3

3是确定的数值,f(2)的值无法确定,需要继续调用函数。

当参数等于2的时候,函数的返回值是f(1)+2

当参数等于1的时候,函数的返回值是f(0)+1

当参数等于0的时候,函数的返回值是f(-1)+0

我们发现,函数每次都会无条件的调用自己。

f(x)永远不会有具体的值,函数调用永远不会停止。

要解决这个问题,我们必须给函数加入一个终止条件。

我们再代码中加入一个判断语句:

如果x>0,函数就调用自己。

否则,直接返回0。

def f(x) :
    if x>0:
        return f(x-1)+x
    else:
        return 0
print(f(3))

【终端输出】

6

分析程序执行的过程:

【递推的过程】

f(3)=f(2)+3

f(2)=f(1)+2

f(1)=f(0)+1

f(0)=0

【回归的过程】

f(0)=0

f(1)=f(0)+1=0+1=1

f(2)=f(1)+2=1+2=3

f(3)=f(2)+3=3+3=6

因此,程序终端输出的结果是6。

9.计算n的阶乘

9.1什么是阶乘

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积。

0的阶乘为1。

自然数n的阶乘写作n!

n!=1×2×3×...×n

阶乘可以用递归方式定义:0!=1,n!=(n-1)!×n。

【示例】

1!=1

2!=1!×2=1×2=2

3!=2!×3=2×3=6

4!=3!×4=6×4=24

5!=4!×5=24×5=120

9.2计算5!

def f(n) :
    if n == 1 :
        return 1
    else:
        return n*f(n-1)
print(f(5))

【终端输出】

120
  1. 定义函数f,参数是n,注意自定义函数语句以英文冒号:结尾;
  2. 递归函数的终止条件:如果n=1,返回值为1
  3. 自定义函数要实现的功能是n*f(n-1)

f(n)和f(n-1)函数名相同,只是参数不同。

因此,在自定义函数f(n)中,它自己调用了自己。

  1. 最后是调用函数,调用函数的语法为函数名(参数)

这里的函数名是f,要传入的实际参数为5。

【参数传递过程】

当参数等于5的时候,函数的返回值是5×f(4)

当参数等于4的时候,函数的返回值是4×f(3)

当参数等于3的时候,函数的返回值是3×f(2)

当参数等于2的时候,函数的返回值是2×f(1)

当参数等于1的时候,函数的返回值是1,即f(1)=1

【程序的执行过程】

【递推的过程】

f(5)=5×f(4)

f(4)=4×f(3)

f(3)=3×f(2)

f(2)=2×f(1)

f(1)=1

【回归过程】

f(1)=1

f(2)=2×f(1)=2×1=2

f(3)=3×f(2)=3×2=6

f(4)=4×f(3)=4×6=24

f(5)=5×f(4)=5×24=120

【总结】

很多同学会觉得写代码比计算更复杂,耗费时间更多。

那是因为我们要计算的阶乘数比较简单。

那如果我们要计算的是40!,大家观察下面的代码的输出结果,看看是否还能自己计算呢?

def f(n) :
    if n == 1 :
        return 1
    else:
        return n*f(n-1)
print(f(40))

【终端输出】

815915283247897734345611269596115894272000000000
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92400
  • 数据存储
    +关注

    关注

    5

    文章

    895

    浏览量

    50584
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
收藏 人收藏

    评论

    相关推荐

    220. Python递归函数和匿名函数:15.1 了解递归 #硬声创作季

    python
    充八万
    发布于 :2023年07月05日 23:21:46

    221. Python递归函数和匿名函数:15.2 递归之回顾函数返回值

    python
    充八万
    发布于 :2023年07月05日 23:22:55

    224. Python递归函数和匿名函数:15.5 递归出口问题

    python
    充八万
    发布于 :2023年07月05日 23:25:15

    225. Python递归函数和匿名函数:15.6 了解lambda

    python
    充八万
    发布于 :2023年07月05日 23:26:25

    231. Python递归函数和匿名函数:15.12 lambda参数之args

    python
    充八万
    发布于 :2023年07月05日 23:32:14

    233. Python递归函数和匿名函数:15.14 lambda应用之带判断的lambda

    python
    充八万
    发布于 :2023年07月05日 23:34:33

    220. Python递归函数和匿名函数:15.1 了解递归

    python
    充八万
    发布于 :2023年07月11日 20:23:58

    221. Python递归函数和匿名函数:15.2 递归之回顾函数返回值

    python
    充八万
    发布于 :2023年07月11日 20:25:56

    224. Python递归函数和匿名函数:15.5 递归出口问题 #硬声创作季

    python
    充八万
    发布于 :2023年07月11日 20:28:15

    226. Python递归函数和匿名函数:15.7 体验lambda #硬声创作季

    python
    充八万
    发布于 :2023年07月11日 20:30:35

    229. Python递归函数和匿名函数:15.10 lambda参数之一个参数

    python
    充八万
    发布于 :2023年07月11日 20:34:04

    快速掌握Python递归函数与匿名函数调用

    函数Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名
    发表于 07-19 16:22