有了这本书学习递归算法不再那么难

news2025/1/15 12:49:12

递归是一种编程技术,能够产生相当优雅的代码,但它也经常会把写代码和看代码的程序员给弄糊涂。这并不是说程序员可以或者应该忽略递归。尽管大家都知道递归比较难,但是这是计算机科学领域的一个重要话题,它能让你敏锐地观察到编程问题的解法。了解递归至少能够令你在编程面试中取得好成绩。

如果你是学生,而且对计算机专业感兴趣,那么必须先攻克递归这个难点,然后才能理解其他常见的算法。如果你在毕业后参加编程培训或者通过自学而了解编程,那么可能不需要像计算机专业的人那样,必须学习一些偏理论的计算机知识,便即使如此,你也需要了解递归,因为参加编程面试时,你仍然可能会遇到要在白板上写递归代码的情况。如果你已经是一位有经验的软件开发者,但是从来没有接触过递归算法,那么你接下来可能会发现不学递归实在太不应该了。

不必担心。虽然递归讲起来比较困难,但是理解起来并没有那么困难。第1章会提到,许多人对递归有误解是因为他们没有得到很好的指导,而不是因为递归本身有多么困难。另外,递归函数在日常编程中用得不是特别频繁,因此许多人即使不懂或不使用递归,也能写程序。

递归算法背后的理念是相当精彩的,即便你在编程中很少使用递归,这种理念也依然能够帮助你更深入地理解编程。另外,递归之美还体现在图形上面。这指的是一种名为分形(fractal)的数学艺术,这种形状与它自身的一部分是相似的。图1 (a) ~(c)列出了几个分形示例。

有了《递归算法与项目实战》你会发现你不仅会掌握这项优秀的技术,还能了解到许多人不清楚的一件事;递归其实没有我们想象中的那么复杂。

递归算法与项目实战

递归令人生畏,它是编程面试中经常提到的高级计算机科学主题。但是递归并没有什么神奇之处。
本书使用 Python 和 JavaScript 示例讲述递归的基础知识,并阐明递归算法的基本原理。你将了解何时使用递归函数(最重要的是,何时不使用它),如何在求职面试中快速实现递归算法,如何使用递归法解决编程中的难题。

本书主要内容:
• 递归函数如何使用调用栈这种数据结构;
• 如何简化递归函数的编写;
• 如何使用递归算法为文件系统编写脚本,绘制分形,创建迷宫等;
• 如何通过记忆化尾和调用优化使递归算法更高效。

本书化繁为简,用一种通俗易懂的方式讲述递归算法。如果你希望精通递归算法或者提升编程水平,那么本书值得阅读。

本书凝聚了作者多年的Python教学经验,内容通俗易懂,旨在剖析递归及其本质。本书不仅结合Python程序和 JavaScript 程序讲述编程的基础知识,还讲述如何利用递归算法计算阶乘,计算斐波那契数列,遍历树,求解迷宫问题,实现二分搜索,完成快速排序和归并排序,计算大整数乘法,计算排列和组合,解决八皇后问题等。

本书不仅适合开发人员阅读,还可供计算机相关专业的师生参考。

目  录

第1部分 理解递归

第1章 递归 3

1.1 如何定义递归 3

1.2 函数 5

1.3 栈 7

1.4 调用栈 9

1.5 递归函数和栈溢出 11

1.6 基本情况与递归情况 13

1.7 位于递归调用之前与之后的代码 15

1.8 小结 18

延伸阅读 18

练习题 18

第2章 递归与迭代 20

2.1 计算阶乘 20

2.1.1 迭代式的阶乘算法 21

2.1.2 递归式的阶乘算法 21

2.1.3 用递归计算阶乘为什么很不合适23

2.2 计算斐波那契数列 24

2.2.1 用迭代法计算斐波那契数列 24

2.2.2 用递归法计算斐波那契数列 25

2.2.3 用递归法计算斐波那契数列为什么很不合适 27

2.3 把递归算法转换成迭代算法 27

2.4 把迭代算法转换成递归算法 29

2.5 案例研究:指数运算 32

2.5.1 用递归函数实现指数运算 33

2.5.2 用递归算法的思路实现迭代式的指数计算函数 34

2.6 在什么场合下需要使用递归 37

2.7 如何编写递归算法 39

2.8 小结 39

延伸阅读 40

练习题 40

实践项目 40

第3章 经典的递归算法 42

3.1 求数组中各元素之和 42

3.2 反转字符串 45

3.3 判断某字符串是否为回文 48

3.4 汉诺塔问题 50

3.5 洪泛填充算法 56

3.6 阿克曼函数 60

3.7 小结 62

延伸阅读 63

练习题 63

实践项目 63

第4章 回溯与树的遍历算法 65

4.1 树的遍历 65

4.1.1 Python 与 JavaScript 中的树状数据结构 66

4.1.2 遍历树状结构 68

4.1.3 树的先序遍历 68

4.1.4 树的后序遍历 70

4.1.5 树的中序遍历 71

4.2 在树中寻找由 8 个字母构成的名字 72

4.3 计算树的深度 74

4.4 走迷宫 76

4.5 小结 83

延伸阅读 84

练习题 84

实践项目 85

第5章 分治算法 86

5.1 二分搜索 86

5.2 快速排序 89

5.3 归并排序 96

5.4 求数组中各整数之和 103

5.5 卡拉楚巴乘法 104

5.6 卡拉楚巴算法背后的数学原理 109

5.7 小结 110

延伸阅读 111

练习题 112

实践项目 112

第6章 排列与组合 114

6.1 集合论的术语 114

6.2 如何寻找每一种无重复元素的排列 117

6.3 用多层循环获取各种排列方式 120

6.4 编写密码破解器 122

6.5 通过递归计算 k组合 125

6.6 获取各种正确的括号匹配形式 130

6.7 幂集 134

6.8 小结 137

延伸阅读 138

练习题 138

实践项目 139

第7章 记忆化与动态规划 140

7.1 记忆化 140

7.1.1 自上而下的动态规划 140

7.1.2 函数式编程中的记忆化 141

7.1.3 对递归式的斐波那契算法做记忆化处理 143

7.2 Python 的 functools 模块 146

7.3 对非纯函数做记忆化会怎样 147

7.4 小结 148

延伸阅读 148

练习题 149

第8章 尾调用优化 150

8.1 尾递归与尾调用优化的原理 150

8.2 如何通过累加器参数做尾递归 152

8.3 尾递归的局限 153

8.4 尾递归案例研究 154

8.4.1 用尾递归反转字符串 154

8.4.2 用尾递归寻找子字符串 155

8.4.3 用尾递归做指数运算 156

8.4.4 用尾递归判断某数是奇数

还是偶数 156

8.5 小结 158

延伸阅读 159

练习题 159

第9章 绘制分形 160

9.1 海龟绘图 160

9.2 基本的海龟函数 162

9.3 谢尔宾斯基三角形 163

9.4 谢尔宾斯基地毯 167

9.5 分形树 170

9.6 科赫曲线及科赫雪花 174

9.7 希尔伯特曲线 176

9.8 小结 179

延伸阅读 179

练习题 180

实践项目 180

第2部分 项目

第10章 文件查找器 185

10.1 文件搜索程序的完整代码 185

10.2 用匹配函数来表示特定的搜索

标准 186

10.2.1 寻找偶数字节的文件 187

10.2.2 寻找名称包含所有元音字母的文件 188

10.3 用递归式的 walk()函数走查

文件夹 188

10.4 用特定的匹配函数调用 walk() 函数以执行搜索 190

10.5 用 Python 标准库中的函数处理 文件 191

10.5.1 寻找与文件名有关的信息 191

10.5.2 寻找与文件的时间戳有关的信息 192

10.5.3 修改文件 194

10.6 小结 195

延伸阅读 195

第11章 迷宫生成器 196

11.1 完整的迷宫生成程序 196

11.2 设定迷宫生成器所使用的常量 201

11.3 创建表示迷宫的数据结构 202

11.4 输出表示迷宫的数据结构 203

11.5 用递归回溯算法在迷宫中挖路 204

11.6 触发递归调用链 208

11.7 小结 209

延伸阅读 209

第12章 解决滑块拼图问题 210

12.1 递归地解决15滑块拼图问题 210

12.2 完整的滑块拼图解决程序 212

12.3 设定程序需要使用的常量 220

12.4 用适当的数据结构表示滑块拼图的状态 221

12.4.1 显示拼图 221

12.4.2 创建一个新的数据结构 222

12.4.3 寻找拼图中的空白格子所在的位置 223

12.4.4 移动滑块 223

12.4.5 撤销某次移动 225

12.5 设定新的拼图谜题 225

12.6 递归地解决滑块拼图谜题 228

12.6.1 用 solve()函数触发算法并演示算法给出的答案 229

12.6.2 在 attemptMove()函数中实现核心算法 230

12.7 反复启动 solve()函数并逐渐

放宽步数限制 233

12.8 小结 235

延伸阅读 235

第13章 分形图案制作器 236

13.1 程序内置的几种分形 236

13.2 分形图案制作器程序所采用的算法 238

13.3 分形图案制作器程序的完整代码 240

13.4 设定常量并配置海龟的参数 243

13.5 编写图形绘制函数 244

13.5.1 drawFilledSquare()函数 245

13.5.2 drawTriangleOutline()函数 247

13.6 在递归过程中反复执行图形绘制函数 248

13.6.1 准备工作 249

13.6.2 解析字典之中的递归规则 250

13.6.3 根据字典所描述的规则执行递归 252

13.7 设计递归的规则与参数 254

13.7.1 四角分形 254

13.7.2 螺旋方块 255

13.7.3 双螺旋方块 255

13.7.4 三角螺旋 255

13.7.5 康威生命游戏的滑翔机 256

13.7.6 谢尔宾斯基三角形 256

13.7.7 波浪 257

13.7.8 号角 257

13.7.9 雪花 258

13.7.10 作为基本图形的正方形或等边三角形 259

13.8 自己设计分形 259

13.9 小结 260

延伸阅读 261

第14章 画中画制作器 262

14.1 安装 Pillow 库 262

14.2 把基本图像准备好 263

14.3 画中画制作器程序的完整代码 265

14.4 在执行递归替换之前先做一些准备工作 266

14.5 寻找有品红色像素出现的矩形区域 268

14.6 缩小基本图像 269

14.7 递归地替换图中的品红色像素 272

14.8 小结 274

延伸阅读 274

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

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

相关文章

【linux进程(七)】程序地址空间深度剖析

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 程序地址空间 1. 前言2. 什么…

中国卖家的出路:TikTok电商重塑东南亚市场

2023年10月4日,印尼政府发布了一则重要公告,宣布不再允许社交媒体作为商品销售平台。这一决策直接影响了TikTok在印尼的电商业务,迫使该平台关闭了其印尼市场的电商运营。 对于TikTok电商而言,印尼市场一直占据着重要地位&#x…

机器视觉工程师们,人的命运大多数连在一起

看着鱼池里的小鱼,很是治愈。自己的往后的生活还要继续。 有次出差,和工作经验13年机器视觉工程师,他用手指着流水线上的操作工说,他们失业,去干什么,回家种田吗?都机械化种田,回家…

程序员为啥要做副业(02)-中指备用金

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

table 部分列宽度固定,剩余列宽度等分

table 固定列固定宽度&#xff0c;剩余列给最小宽度 <thead><tr><th rowspan"2" style"width:100px">序号</th><th rowspan"2" style"width:120px">姓名</th><th v-for"date in dates&q…

如何实现可靠的数据调度同步,数据同步方案看一下!

随着企业规模不断扩大&#xff0c;分支机构越来越多&#xff0c;跨区域跨国的集团越来越多&#xff0c;越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上&#xff0c;能够进行实时的调度和同步&#xff0c;从而需要部署一套数据同步方案&#xff0c;实现服务器与…

DC电源模块如何承受超负荷电流的能力

BOSHIDA DC电源模块如何承受超负荷电流的能力 DC电源模块是现代电子设备中必不可少的部件&#xff0c;它们通常被用来将交流电转换为稳定的直流电&#xff0c;为电子设备提供所需的电力。在某些情况下&#xff0c;DC电源模块可能会遇到超负荷电流的情况&#xff0c;如启动过程…

CleanMyMacXMac4.14.4版本系统优化工具

CleanMyMac是macOS上不可或缺的清理工具&#xff0c;它的作用非常强大&#xff0c;可以帮助用户清理系统、照片、邮件、iTunes垃圾&#xff0c;甚至是隐私数据。以下是CleanMyMac的主要功能和特点&#xff1a; 首先&#xff0c;CleanMyMac可以帮助清理系统垃圾&#xff0c;包括…

Pyqt5 List Widget 用户自定义添加/删除字段

添加和删除字段的逻辑 在窗口上显示一个list widget的窗口&#xff0c;还有一个添加字段的按钮 点击添加字段会弹出一个输入框&#xff0c;将内容作为一个item添加到list widget中 点击对应的已添加的字段&#xff0c;即会显示删除按钮&#xff0c;点击即可删除该字段 效果…

登录Edge发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01

登录Edge 发生了错误请稍后再试。Oxcfff82e发送反馈ccf05c90-0acc-0005-3100-f2cccc0ada01 1、如果连接了 VPN &#xff0c;建议断开 VPN。 2、按 “Windows 徽标键X”&#xff0c;启动 “Windows Power Shell&#xff08;管理员&#xff09;”&#xff08;也可以自行以管理员…

【java学习—十】List集合(6)

文章目录 1. List 与 ArryList2. 应用2. ArrayList 与 Vector 1. List 与 ArryList List 代表一个元素有序、且可重复的集合&#xff0c;集合中的每个元素都有其对应的顺序索引     List 允许使用重复元素&#xff0c;可以通过索引来访问指定位置的集合元素。     List…

开源库存管理系统InvenTree的安装

本文是应网友 shijie880500 要求折腾的&#xff1b; 什么是 InvenTree &#xff1f; InvenTree 是一个开源的库存管理系统&#xff0c;提供强大的低级别库存控制和零件跟踪。InvenTree 系统的核心是 Python/Django 数据库后端&#xff0c;它提供了一个管理界面&#xff08;基于…

Mac 上免费的网络Folx Mac 下载器

Mac最好的下载工具Folx Pro 5 for Mac 是由兔八哥爱分享整理发布 。 Folx Pro 5 for Mac是目前Mac平台上数一数二的下载工具&#xff0c;功能强大&#xff0c;几乎可以满足您的所有下载需求。folx pro for mac完整版不但可以下载网上任何文件&#xff0c;而且支持断点续传&…

大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)

告警解释 根据本地历史数据备份策略&#xff0c;集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件&#xff0c;审计日志可以成功转储。审计日志转储失败&#xff0c;系统产生此告警。如果第三方服务器的转储目录磁盘空间不足&#xff0c;或者用户修改了转…

【JavaSE】逻辑控制:顺序、分支和循环结构

目录 一、概述与顺序结构 1.逻辑控制的概述 2.顺序结构 二、分支结构 1.if语句 2.switch语句 3.switch语句与if语句的对比 三、循环结构 1.while语句 2.for语句 3.do…while循环&#xff08;选学&#xff09; 四、循环的跳转 1.break语句 2.continue语句 五、总…

【设计模式】第20节:行为型模式之“备忘录模式”

一、简介 备忘录模式也叫快照模式&#xff0c;具体来说&#xff0c;就是在不违背封装原则的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容&#xff1a;一部分是…

git重装后如何连接以前项目

git重装后如何连接以前项目 1、配置秘钥 点击 Git Bash Here&#xff0c;进入命令操作窗口 生成本地git仓库秘钥&#xff1a; 1、填写自己邮箱 2、一直回车 ssh-keygen -t rsa -C “xxxxxqq.com”3、使用cat查看生成的秘钥&#xff0c;粘贴并设置到gitee上 cat ~/.ssh/id_r…

3.2、Linux开发工具之gcc/g++

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 背景知识 gcc如何完成 预处理 编译 汇编 链接 函数库 gcc选项 g和gcc的区别 背景知识 二进制-->汇编-->C-->C&#xff0c;java&#xff0c;php等 刚开始&#xff0c;工程师和科学家们是通过二进制指…

Flutter PopupMenuButton下拉菜单

下拉菜单是移动应用交互中一种常见的交互方式,可以使用下拉列表来展示多个内容标签,实现页面引导的作用。在Flutter开发中,实现下拉弹框主要有两种方式,一种是继承Dialog组件使用自定义布局的方式实现,另一种则是使用官方的PopupMenuButton组件进行实现。 如果没有特殊的…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录