python数据结构与算法 20 递归和递归三定律

2024年Python最新Python数据结构与算法(4)--递归 🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。 阅读详情

递归

本章目标

  • 理解很多复杂问题,如果不用递归就很难解决,用递归也许非常简单
  • 学会怎样进行递归编程
  • 理解并应用递归三定律
  • 理解递归也是一种迭代
  • 建立一个问题的递归方法
  • 理解递归在计算机系统内是如何进行的。

什么是递归?

递归是解决问题的一种方法,它把问题拆解得越来越小,直到变得非常容易,一般情况下,递归过程要包括一个自我访问的函数。与表面看起来似乎不一样,其实递归允许我们写出非常简洁的代码,但解决问题却很复杂,用其他办法很难处理。

列表元素求和

我们先不用递归,看一个问题不用递归是如何处理的。

假如你想计算一个整数列表各项的和,如[1,3,5,7,9]。下面的代码所示,函数使用了一个累加变量(theSum)来计算所有列表的项目的和:

deflistsum(numList):

    theSum = 0

    for i in numList:

        theSum = theSum + i

    return theSum

 

print(listsum([1,3,5,7,9]))

假如我们没有while和for循环语句,你又怎样来计算一系列数字的和呢?如果你是数学家,也许会想到,加法是一个函数,有两个参数,就是一对数字。把一个列表求和问题转为两个数字的求和问题,那么上面的过程可以写成一个完全括号表达式:

((((1+3)+5)+7)+9)

We can also parenthesize the expression theother way around,

还可以用另一种完全括号表达式:

(1+(3+(5+(7+9))))

注意最里层的括号,(7+9)的计算,我们不需要循环或其他结构就能算出来,事实上用下面的顺序计算出最后的和:

 

total= (1+(3+(5+(7+9))))

total= (1+(3+(5+16)))

total= (1+(3+21))

total= (1+24)

total= 25

 

这种想法怎样变成python程序呢?首先要重新表达一下元素求和的问题。我们也可以说列表元素之和,是第一个元素numList[0]和其他所有元素的和numList[1:],就如下式所示:

 

listSum(numList)=first(numList)+listSum(rest(numList))

在这个等式中,first(numList) 是列表第一个数据项,而rest(numList)是除第一项之外所有其他项,用python这样表达:

1

ef listsum(numList):

   if len(numList) == 1:

        return numList[0]

   else:

        return numList[0] + listsum(numList[1:])

 

print(listsum([1,3,5,7,9]))

2

3

4

5

6

7


这段7行的代码里有几个关键的想法。首先,第2行,检查这个列表是否只有一个数据,这步检查很重要,是函数的“例外条款”。长度为1的列表求得最简单,就是数据自身。其次,第5行,我们的函数调用了它自己!这正是我们把它叫做递归算法的原因,递归函数就是调用自己的函数。

如图1所示,一连串的递归调用来求得列表[1,3,5,7,9]的和,应该把这连串的调用当作连续的简化,每次调用,都是解决越来越简单的问题,直到问题再也不能简化。



图1 列表求和的递归调用

当问题到了不能再简化的终点,我们开始归拢被简化的问题,直到最开始的问题得以解决。如图2所示,列表求和从连串调用中返回,当listSum从最早一次调用中返回时,整个问题就解决了。


图2 列表求和的连续返回过程

递归三定律

象阿西莫夫机器人三定律一样,所有递归算法必须遵守三个重要定律:

1.   递归算法必须有一个基点

2.   递归算法必须有一个趋向基点的状态变化过程

3.   递归算法必须自我调用

让我们更细致地研究一下这些定律,并观察在列表求和算法是如何使用的。首先,基点是让算法停止递归的点,通常是一个可以直接得到答案的简单问题。在列表求和过程中,基点是长度为1一个列表。

遵守第二定律,我们必须安排一个状态变化并朝向基点运行。状态变化意思是递归算法中某些数据是可变的,通常是让我们的问题变简单的数据在变。在列表求和算法中,主要数据是列表,所以必须改变列表。既然基点是长度为1的列表,那最自然的过程就是缩短列表。这就是第5行的过程,每次递归都在计算一个更短的列表。

第三定律是算法必须自我调用。这正是递归的定义。递归的概念对很多初级程序员来说容易犯糊涂。作为初入门者,你要了解到这个功能之所以好用,是因为它可以把大的问题分解成小问题。小问题就是可以写一个函数就能解决的问题。当我们讨论递归的时候,似乎是陷在一个圈套中,我们有一个要用函数解决的问题,但是这个函数要调用自己来解决问题,但在逻辑上并非如此,递归解决问题的方式是优雅地把问题变得越来越小越来越容易。

在本章的后部,我们会看到更多的实例,在每个实例中,我们都聚焦在设计一个方案,使用递归三定律来分解问题。







 

数据结构与算法(Python语言实现)算法题目(总集篇) 集合了我学习算法的所有题目,都已经分类归档好! 阅读详情

相关推荐

数据结构与算法Python版之北大慕课笔记(二)

数据结构与算法Python版之北大慕课笔记(二))一、递归基础1. 递归三定律2. 递归版数列求和3. 递归版任意进制转换4. 递归调用的实现和深度限制二、递归可视化:分形树1. 递归可视化2. 分形树:自相似递归图形3. 谢尔宾斯基Sierpinski三角形4.分治策略三、优化问题和贪心策略1. 找零兑换问题 一、递归基础 1. 递归三定律 递归算法必须有一个基本结束条件(最小规模问题的直接解...

冠军阿狗的博客 1078

Python数据结构与算法(4)--递归

文章目录递归1.初始递归2.递归的应用1.数列求和2.任意进制转换3.递归调用的实现4. 递归可视化 分形树 递归 1.初始递归 递归使用的是分治策略 递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。 初识递归 : 数列求和 # 数列的和=“ 首个数” +“ 余下数列” 的和 # 如果数列包含的数少到只有1个的话,它的和就是这个数了 def lists

li520_fei的博客 242

裘宗燕-数据结构与算法python描述笔记(队列)

裘宗燕-数据结构与算法python描述笔记(队列):队列的实现以及迷宫问题的求解

qq_42927387的博客 1091

Python数据结构与算法——递归

递归,python中递归深度限制的解决办法,递归求阶乘和汉诺塔问题

qq_63043783的博客 545

python数据结构: 递归1

1. 递归的定义 ❖递归 Recursion是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。 ❖递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。 ❖递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单,令人赞叹。 2.初识递归:数列求和 #用for循环写 def listsum...

数据分析阿宇君的博客 410

Python数据结构与算法(4.1)——递归

递归函数是直接调用自己或通过一系列语句间接调用自己的函数。递归在程序设计有着举足轻重的作用,在很多情况下,借助递归可以优雅的解决问题。本节主要介绍递归的基本概念以及如何构建递归程序。

盼小辉丶的博客 10万+

递归的三定律

递归的三定律 例: def listsum(numList): if len(numList) == 1: return numList[0] else: return numList[0] + listsum(numList[1:]) print(listsum([1,3,5,7,9])) 所有递归算法必须服从三个重要的定律: 1. 递归算法必须具有基本情况。 2. 递归算法必须改变其状态并向基本情况靠近。 3. 递归算法必须以递归方式调用自身。 首先,基本情况是算法停止递归的条件。基本情况通常是足够

hezhenpp的博客 2222

C/C++_五大常规算法_分治算法

分治法 一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,伪造的硬币和普通硬币从表面上看不出有任何差别,但是那 个伪造的硬币比真的硬币要轻。现有给你一台天平,请你在尽可能最短的时间内找出那枚伪造的硬币。 常规思维: 每次从待比较的硬币中取两枚进行计较,如果天平平衡(相等)就继续取剩下的硬币进行比较 继续以上过程,直到找到硬币。 强者思维: 我们先将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有一半轻一半重,而我们要的就是轻的那组,重 的舍去。接下来我们继续对轻的进行五五分

weifc-wei 的博客 2724

数据结构与算法分析(四):递归

本系列为《Python数据结构与算法分析》第二版学习笔记,作者:布拉德利.米勒;戴维.拉努姆。 文章目录一、递归三原则二、用递归计算一列数之和三、将整数转换为任意进制的字符串四、用递归画谢尔平斯基三角形 递归是解决问题的一种方法,它将问题不断地分成更小的问题,直到子问题可以用普通的方法解决。通常情况下,递归会使用一个不停调用自己的函数。 一、递归三原则 (1)递归算法必须有基本情况; (2)递归算法必须改变其状态并向基本情况靠近; (3)递归算法必须递归的调用自己。 基本情况是指使算法停止递归的条件,这通常

jason_cdd的博客 1079

使用sklearn学习多项式回归(三)

1,什么是线性 我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。 1.1,变量之间的线性关系 ”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量

理科男同学 5100

Pyside6+qml+Qtcreator项目实战

PYTHON and QT QUICK - Custom Buttons With QML And JavaScript - [MODERN GUI]-#01

u014627020的博客 918

数据结构与算法 python版 之 递归三定律

递归的定义

qq_34589842的博客 612

深入解析CAN2.0A与CAN2.0B协议:帧格式与通信机制对比

本文深入对比了CAN2.0A与CAN2.0B协议的核心差异,重点解析了11位标准帧与29位扩展帧的帧格式、标识符长度及通信机制。文章阐述了CAN2.0B向下兼容的特性,并探讨了在汽车电子、工业控制等复杂网络中,如何根据项目需求、兼容性及实时性要求,在标准帧与扩展帧之间做出合理选择。

weixin_29163797的博客 392

数据结构与算法Python版 递归与可视化

介绍递归“三定律”和实现分析。介绍递归可视化:分形树和谢尔宾斯基三角形。

分享、交流、合作 903

先进封装技术 Part03---重布线层(RDL)的科普

RDL是一种在芯片封装过程中用于重新分布电气连接的技术。它通过在芯片表面或中介层上形成额外的布线层,重新分配芯片的I/O(输入/输出)位置,以适应不同的封装需求和提高电气连接的灵活性。

阿拉伯梳子的专栏 4700

AI 模型训练核心方法论:零基础也能落地的 8 个关键阶段

本文是为 AI 零基础学习者打造的模型训练入门指南,以生活化语言拆解核心概念,规避专业术语壁垒。内容先通俗阐释模型训练、监督学习、数据集划分等基础概念,再按问题定义、数据准备、模型选择、环境搭建、训练、评估、调参、部署 8 个阶段,拆解完整训练流程,搭配 PyTorch 代码示例与实战案例,同时提供资源预算、常见问题解决方案及学习路径。指南强调数据的核心重要性,推荐新手优先使用迁移学习和免费 GPU 资源,兼顾理论与实操,帮助学习者快速上手,避开训练误区,独立完成从模型搭建到部署的全流程。

weixin_52741870的博客 468

数据结构与算法python版本之线性结构之递归Recursion

实际上,真正的谢尔宾斯基三角形是完全不可见的,其面积为0,但周长无穷,是介于一维和二维之间的分数维(约1.585)构造。分形Fractal,是1975年由Mandelbrot开创的新学科——一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似的)是整体缩小后的形状,即具有。上面这个例子,最内层的括号是(7+9),这是无需循环即可计算的,实际上整个求和的过程就是按照括号内一步一步计算的。这样,我们可以把树分解为三个部分:树干、左边的小树、右边的小树,分解后,正好符合递归的定义:对自身的调用;

qq_41780297的博客 1083

【Flink】Flink提交任务到Yarn报错Unable to close file because the last blockBP enough number of replicas

当使用 HDFS 存储文件时,每个数据块会有多个副本分布在不同的节点上,以确保数据的可靠性和容错性。然而,由于某种原因,最后一个数据块 blk_1101776325_28036289 的副本数量不足,导致无法成功关闭文件。如果确定副本数量正确,并且问题仍然存在,可以尝试手动修复副本不足的情况。异常消息表明在关闭文件时出现问题,我的原因是hadoop上有个节点有问题,导致提交到那个节点的时候,无法传递包到相关的机器上。检查 HDFS 集群的状态,确保所有节点都正常工作,没有节点宕机或网络故障等问题。

九师兄 934

数据结构与算法Python版 递归的应用

递归应用示例,包括:十进制转换任意进制,汉诺塔问题和探索迷宫问题。

分享、交流、合作 1003

TMS320F28335调试跟踪的问题:DSP从上电复位,一直到执行main()的第一条语句之间,都干了些什么,以及CCS调试时程序查找的问题

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1210

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python递归算法详解

本文介绍了递归算法的基本原理、应用场景,并通过具体的Python代码示例详细讲解了递归算法的使用。递归是一种强大的算法设计技巧,能够解决许多复杂的问题。在应用递归算法时,需要注意递归终止条件的正确性,以避免无限递归的问题。通过掌握递归的原理和应用技巧,我们可以更好地理解和应用递归算法,提升问题解决的能力。

Rocky006的博客 4378

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python数据结构与算法学习之递归

递归

Daley_的博客 955

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Python】教你彻底了解Python中的数据结构与算法

​​​​。

Easonmax的博客 4079

python数据结构与算法-递归

学习python数据结构和算法。该书的第三章节-递归。介绍了一些对您理解本文稍后介绍的算法很重要的概念。了解运行时堆栈和堆是如何工作的,以便在我们的程序中调用函数,成为一名更好的程序员。构建一个关于代码工作原理的心理模型,可以预测代码的功能。编写递归函数对计算机程序员来说也是一项重要的技能。以下是本文应该学到的:•能够识别程序中的各种作用域。•能够识别变量引用属于哪个范围:局部、封闭、全局或内置范围。记住LEGB规则。•能够通过绘制程序执行时的运行时堆栈和堆的图片来跟踪程序的执行。

qq_36771396的博客 745

【数据结构与算法python】递归算法的python实现

1、概念解释 2、实现原理 (1)累加和 (2)进制转换 3、例子 (1)分形树 (2)谢尔宾斯基三角形 (3)汉诺塔

思南的博客 774

数据结构与算法(Python版)十八:什么是递归

什么是递归Recursion? 递归是一种解决问题的方法, 其精髓在于 将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。 递归为我们提供了一种对复杂问题的优雅解决方案, 精妙的递归算法常会出奇简单, 令人赞叹。 初识递归:数列求和 问题:给定一个列表, 返回所有数的和 列表中数的个数不定,需要一个循环和一个累加变量来迭代求和 程序很简单, 但假如没有循环语句? 既不能用 for,也不能用 w

神薯片 6554
上一篇: python数据结构与算法 19有序列表 ADT及实现
下一篇: python数据结构与算法 21 递归的实现和应用
杀了这个男孩
博客等级 码龄18年 149粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值