函数-递归调用

news2024/11/15 14:00:56

目录

一、基本介绍

二、递归能解决什么问题?

三、递归案例

1、打印问题

 2、阶乘问题

四、递归重要规则

五、课堂练习

1、斐波那契数

2、猴子吃桃问题

3、汉诺塔


一、基本介绍

1、简单地说:递归就是函数自己调用自己,每次调用时传入不同的值

2、递归有助于编程者解决复杂问题,同时可以让代码变得简洁

二、递归能解决什么问题?

1、各种数学问题,如8皇后问题,汉诺塔,阶乘问题,迷宫问题等等

2、各种算法中也会使用到递归,如快排,归并排序,二分查找,分治算法等

3、将用栈解决的问题->递归,代码比较简洁

三、递归案例

1、打印问题

# 打印问题
def test(n):
    if n>2:
        test(n-1)
    print("n =", n)

# 调用test(4)
test(4)

 2、阶乘问题

# 阶乘问题
def factorial(n):
    if n==1:
        return 1
    else:
        return factorial(n-1)*n

# 打印4的阶乘
print(factorial(4))

四、递归重要规则

1、执行一个函数时,就创建一个新的空间(栈空间)

2、函数的变量是独立的,比如,变量n

3、递归必须向退出递归的条件逼近,否则就是无限递归,就会出现RecursionError: maximum recursion depth exceeded

4、当一个函数执行完毕,或遇到return,就会返回,遵守谁调用,就将结果返回给谁

五、课堂练习

1、斐波那契数

请使用递归的方式求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的值是多少?

# 斐波那契数
def fbn(n):
    """
    功能:返回n对应的斐波那契数
    :param n:
    :return: 
    """
    if n==1 or n==2:
        return 1
    # 如果n>2,则对应的斐波那契数为n-1和n-2对应的斐波那契数的和
    else:
        return fbn(n-1)+fbn(n-2)

# 完成测试
print(fbn(7))  # 13

2、猴子吃桃问题

猴子吃桃问题:有一堆桃子,猴子第1天吃了其中的一半,并再多吃一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没有吃),发现只有1个桃子了。问题:最初有多少个桃子?

# 猴子吃桃问题
"""
    思路分析:
    1、day==10时,有桃子数 1
    2、day==9时,day9-day9/2-1=day10
       有桃子数 day9=(day10+1)*2
    3、day==8时,有桃子数 day8=(day9+1)*2
"""

# 定义函数,返回对应天数对应的桃子数
def peach(day):
    if day==10:
        return 1
    # 如果是1<=day<10,的范围就是从后一天开始推导
    else:
        return (peach(day+1)+1)*2

# 完成测试
print("最初的桃子数为:", peach(1))  # 1534

3、汉诺塔

 

# 汉诺塔
def hanoi_tower(num, a, b, c):
    """
    输出指定 num个盘子的移动顺序
    :param num: 指定盘子数
    :param a: 表示A柱子
    :param b: 表示B柱子
    :param c: 表示C柱子
    :return:
    """
    # 如果只有一个盘子
    if num == 1:
        print("第1个盘从:", a, "->", c)
    else:
        # 有多个盘,我们认为只有两个,上面所有的盘和最下面的盘
        # 移动上面所有的盘从A移动到B柱子,这个过程会借助到C柱子
        hanoi_tower(num - 1, a, c, b)
        # 移动最下面的盘,从A移动到C柱子
        print(f"第{num}个盘从: {a} -> {c}")
        # 把上面所有的盘从B移动到C柱子,这个过程会借助到A柱子
        hanoi_tower(num - 1, b, a, c)


# 完成测试
hanoi_tower(3, "A", "B", "C")

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

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

相关文章

利用python自动化运维i脚本实现远程连接服务器并实现相应命令

目录 前言&#xff1a; 一.调用的python库介绍 二.在主机上安装好相应的库 2.1激活虚拟环境 三.代码实现以及解析 四.效果的实现 五.致谢 前言&#xff1a; 在当今快速发展的技术环境中&#xff0c;自动化运维已成为 IT 基础设施管理的关键组成部分。它不仅可以显著提…

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件&#xff0c;它由IBM公司出品&#xff0c;这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等&#xff0c;软件易学且功能非常强大&#xff0c;可以使用SPSS制作图表&#xff0c;例如柱状、饼状、折线等图表&…

CasaOS设备使用Docker安装SyncThing文件同步神器并实现远程管理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于 HTML+ECharts 实现智慧景区数据可视化大屏(含源码)

构建智慧景区数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着旅游业的蓬勃发展&#xff0c;智慧景区的概念逐渐深入人心。通过数据可视化&#xff0c;景区管理者可以实时监控游客流量、设施使用情况以及环境状况&#xff0c;从而提升游客体验和管理效率。本文将详…

昇思学习打卡-22-生成式/DCGAN生成漫画头像

文章目录 DCGAN网络数据处理构造网络生成器判别器损失函数优化器 结果展示 我们将学习DCGAN网络如何数据处理、设置网络&#xff0c;包括生成器、判别器、损失函数、优化器等。 DCGAN网络 DCGAN&#xff08;深度卷积对抗生成网络&#xff0c;Deep Convolutional Generative Ad…

数据结构之《队列》

在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈&#xff0c;在本篇中我们将继续学习另一种线性表的结构——队列&#xff0c;在通过本篇的学习后&#xff0c;你将会对栈的结构有充足的了解&#xff0c;在了解完结构后我们还将进行栈的实现。一起…

JavaScript——变量与运算符、输入输出、判断、循环

文章目录 前言概述使用 js从文件引入 js 代码importjs 的作用变量计算输入格式化输出保留小数向上取整&#xff0c;向下取整条件判断循环总结 前言 为了监督自己的进度&#xff0c;把学习任务一点点都写出来&#xff0c;写多少就算多少&#xff0c;不求完美&#xff0c;只求完…

计算的是如何工作的

文章目录 一. 冯诺依曼体系结构二. CPU三. 指令*四. CPU是如何执行指令的 一. 冯诺依曼体系结构 冯诺依曼是计算机领域的祖师爷, 被评为"二十一世纪最伟大的"全才"" 冯诺依曼提出了冯诺依曼体系结构, 定义了一台计算机, 由这几部分构成: 输入设备: 包括…

STM32---HAL库外设配置--串口外设配置及使用

一&#xff1a;首先按照本人的时钟配置博客配置&#xff0c;配置好基础时钟 二&#xff1a;选择对应串口进行选中,然后配置 配置如下&#xff1a;首先配置成异步收发模式&#xff0c;如图中的序号1 参数设置界面选择默认即可如下图 下图中的1不用设置&#xff0c;默认即可。2…

增长新引擎,构建基于 CDP 的用户运营竞争力

本文将围绕“企业如何通过构建基于 CDP 的用户运营体系提升业务增长”这一核心&#xff0c;详细介绍企业数据化运营现状&#xff0c;拆解用户运营目标&#xff0c;展示神策 CDP 的关键能力以及用户运营策略落地的完整路径。 一、洞察&#xff1a;企业数据化运营面临的挑战 当前…

系统编程--Linux下文件的“其他操作”函数

这里写目录标题 文件存储理论补充dentry、inode 文件其他操作stat函数作用函数原型代码&#xff08;以获取文件大小为例&#xff09;补充&#xff08;获取文件类型&#xff09; lstat函数作用函数原型代码补充&#xff08;获取文件权限&#xff09;总结 tipslink函数作用简介函…

看板项目之vue代码分析

目录&#xff1a; Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面 …

OZON家庭洗剂产品,OZON热卖家庭洗剂用品有哪些

OZON平台上家庭洗剂产品的热销情况主要反映了俄罗斯家庭对于环保、高效、多功能的清洁用品的需求。根据最新数据和市场趋势&#xff0c;以下是一些OZON平台上热卖的家庭洗剂用品&#xff1a;OZON热卖家庭洗剂用品&#xff1a;D。DDqbt。COm/74rD Top1 洗碗液 ЭКО. Гел…

免费【2024】springboot 毕业设计管理系统

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

反序列化-极客大挑战2019php【I have a cat!】

知道这个题考的是反序列化&#xff0c;那么我们第一反应该拿到他的源码。 根据这句话判断【因为每次猫猫都在我键盘上乱跳&#xff0c;所以我有一个良好的备份网站的习惯 不愧是我&#xff01;&#xff01;&#xff01; 】说明有目录 我们直接使用dir开扫&#xff0c;发现有压…

Redis的应用场景及类型

目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下&#xff0c;我们就可以把 Mys…

通信原理-思科实验五:家庭终端以太网接入Internet实验

实验五 家庭终端以太网接入Internet实验 一实验内容 二实验目的 三实验原理 四实验步骤 1.按照上图选择对应的设备&#xff0c;并连接起来 为路由器R0两个端口配置IP 为路由器R1端口配置IP 为路由器设备增加RIP&#xff0c;配置接入互联网的IP的动态路由项 5.为路由器R1配置静…

Blender插入关键帧的位置报错

在操作过程中&#xff0c;有时候是误操作或者是做动画选择了活动插帧集&#xff0c;导致按i键插入关键帧一直报提示&#xff1a;插入关键帧的帧位置或者是其他的报错弹窗。 1、解决方法是&#xff1a;在时间线的抠像(插帧)选项里&#xff0c;将活动插帧集给清空 2、若是骨骼动画…

新智慧:企元数智呈现全新新零售合规分销系统免费送

新智慧&#xff01;企元数智近期发布了令人振奋的消息&#xff1a;他们推出了全新的新零售合规分销系统&#xff0c;并且免费向企业赠送&#xff01;这一举措旨在帮助更多企业轻松实现数字化转型&#xff0c;提高管理效率&#xff0c;实现持续增长。 企元数智的新零售合规分销系…

【Linux】管道通信和 system V 通信

文章目录 一、进程通信原理&#xff08;让不同进程看到同一份资源&#xff09;二、管道通信2.1 管道原理及其特点2.1 匿名管道和命名管道 三、共享内存通信3.1 共享内存原理3.2 创建和关联共享内存3.3 去关联、ipc 指令和删除共享内存 四、消息队列和信号量&#xff08;了解&am…