58.Python的递归函数

news2024/11/16 3:26:31

58.Python的递归函数

文章目录

  • 58.Python的递归函数
    • 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

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

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

相关文章

完整的OpenDDS的发布订阅编写及源码(Windows)

一个完整的OpenDDS的发布订阅编写及源码,包括SimuMsg.idl、SimuMsg.mwc和SimuMsg.mpc,SimuMsgCommon_Export.h、publisher.cpp、subscriber.cpp、SimuMsgDataReaderListenerImpl.h和SimuMsgDataReaderListenerImpl.cpp、SimuMsgDataWriterListenerImpl.h和SimuMsgDataWriterL…

还有企业没有在用它嘛! 适配于多行业的管理系统,各企业之首选

在信息技术高速发展的现代社会,世界经济一体化和企业经营全球化已成为大势所趋。在此背景下,企业为增强自身的竞争力,就要强化管理,规范业务流程,提高透明度,加快商品资金周转,以及为流通领域信…

使用MariaDB线程池提高MySQL的扩展性

摘要:MySQL的线程池能够有效地解决大量短连接的性能问题,大幅提高MySQL数据库的扩展性。但官方MySQL的线程池在收费的企业版中才有,免费的社区版中没有这个功能,这里介绍MairaDB的线程池。 关于作者,姚远:…

不用梯子,GitHub也能访问并提速

引言 我们都知道国内访问github会非常慢,甚至打不开,具体原因这里就不聊了~我们这里聊怎么不用梯子,GitHub也能访问并提速! Github打开慢的原因 Github打开慢的原因其中一个原因:GitHub的CDN域名遭到DNS污染&#xf…

好用的开源个人博客推荐

原文网址:好用的开源个人博客推荐_IT利刃出鞘的博客-CSDN博客 简介 本文推荐个人从几十款开源个人博客中精选的几款开源博客。 halo Github 地址 :https://github.com/halo-dev/halo Star : 24.3k 简介 :一个优秀的开源博客应用。 技术 …

java学习day66(乐友商城)搜索过滤

1.过滤功能分析 首先看下页面要实现的效果: 整个过滤部分有3块: 顶部的导航,已经选择的过滤条件展示: 商品分类面包屑,根据用户选择的商品分类变化 其它已选择过滤参数 过滤条件展示,又包含3部分 商品分…

CNN神经网络

CNN神经网络0.引言0.1.卷积0.2.Relu函数0.3.池化pooling0.4.小节1.前向传播1.1.input layer --> convolution layer1.2.Hidden Layer --> convolution layer1.3.Hidden layer --> pooling layer1.4.Hidden layer --> full connected layer1.5.小节2.反向传播2.1.po…

如何实现微信和淘宝的扫码登录

1、引言 扫码登录这个功能,最早应该是微信的PC端开始搞,虽然有点反人类的功能(不扫码也没别的方式登录),但不得不说还是很酷的。 下面这张图,不管是IM开发者还是普通用户,应该很熟悉&#xff…

高德地图WebGIS

GIS:地理信息系统 1 Web前端JSAPI X.1 创建app ​​​​ X.2 地图显示

热榜,Alibaba最新发布SprinBoot:进阶原理实战与面试题分析指南

为什么要写这本书? 我们知道,Spring Boot是一个集成性的开源框架,内部整合了很多第三方组件和框架。这些组件和框架应用如此之广泛,以至于大家反而往往对如何更好地使用Spring Boot自身的功能特性并不是很重视。事实上&#xff0…

自动化会计从这四个流程开始

自动化会计从这四个流程开始 会计和财务业务流程的自动化对企业领导者来说是一个巨大的机会。对于首席财务官 (CFO) 而言,可以让他们在改善运营和降低成本等传统角色中脱颖而出,同时利用他们在自动化方面的经验成为整个公司数字业…

SpringBoot 单元测试利器-Mockito

Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前,得先了解什麽是 mock 测试 1. 什么是 mock 测试&#xff…

Java Long对象对比,用equals函数

文章目录一、前文二、调试三、后记一、前文 同事问我一个问题,我咋一看也愣住了 代码: if(ObjectUtil.isNotNull(temp.getUserId()) && temp.getUserId()!SecurityUtils.getUserId()) {logger.error(temp.toString());logger.error("Securi…

ICV:车规级激光雷达市场规模超7亿美元,补盲雷达有望2024年量产

全球前沿科技咨询机构ICV近期发布了车载激光雷达的市场分析报告,ICV在报告中表示激光雷达是自动驾驶传感器中增速最快的传感器,预计未来五年的复合年增长率达43.4%。此外,混合固态式激光雷达近五年内将仍以应用转镜技术为主。 本报告旨在评估…

【store商城项目05】新增收获地址的开发

新增收获地址的开发1.创建地址表2.创建实体类3.持久层的开发3.1规划需要执行的SQL语句3.2Mapper接口与抽象方法3.3配置SQL映射3.4测试4.业务层的开发4.1规划异常4.2接口和抽象方法4.3实现抽象方法4.4测试5.控制层的开发5.1规划异常5.2设计请求5.3处理请求5.4测试6前端页面1.创建…

【Linux】Linux权限(二)默认权限的来源

默认权限1.默认权限2.默认权限(最终权限)由谁决定2.1起始权限2.2umask(权限掩码)2.3 最终权限的计算3.总结1.默认权限 在Linux下,我们以普通用户创建一个普通文件, 这个普通文件(这里不包括可执行)的默认权…

萤石网络IPO首日破发:市值缩水20亿元,海康威视为控股股东

12月28日,杭州萤石网络股份有限公司(下称“萤石网络”,SH:688475)在上海证券交易所科创板上市。本次上市,萤石网络的发行价为28.77元/股,发行1.13亿股,募资总额为32.51亿元,总市值约…

【1.1】认识微服务--服务架构演变

认识微服务--服务架构演变单体架构分布式架构服务治理微服务微服务架构特征小结知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。 单体架构 单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包…

线性规划求解-MATLAB Lingo Python实现

线性规划求解-MATLAB Lingo Python实现 线性规划 线性规划是辅助人们进行科学管理的一种数学方法,是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。其展开形式可以表示为如下形式: Max⁡(Min⁡)zc1x1c2x2…cnxns.t. {a11x1a12x2⋯a1nxn≥…

2022年度十大科学突破榜单出炉!

科学的进步在很大程度上推动着人类社会的发展。而了解最新年度科学突破,有助于引领我们知晓世界科学进展,看清楚未来方向。故此,知识人网小编本期介绍《科学》杂志最新公布的2022年科学突破榜单。 12月16日,美国《科学》杂志网站列…