【Daily-Algorithm-7】每日算法学习(第七天)—— 递归算法基础,从原理到实战(Python 实现)
递归作为编程中极具魅力的算法思想核心是函数调用自身将复杂问题拆解为规模更小的同类子问题直到触达 “边界条件”递归出口后逐层回溯最终解决原问题。这种 “大事化小、小事化了” 的思路能让代码简洁优雅尤其适合解决具有重复子结构的问题。本文将通过 4 个经典实例带你吃透递归的核心逻辑所有代码均可直接运行建议结合注释逐行理解递归的 “递” 与 “归”。一、阶乘算法递归的入门典范阶乘是递归最基础的应用场景。数学上n!n 的阶乘定义为边界条件0! 10 的阶乘为 1是人为规定的递归出口递归关系n! n × (n-1)!n0 时n 的阶乘等于 n 乘以 n-1 的阶乘代码实现#阶乘运算 def factorial(n): if n0: return 1 else: return factorial(n-1)*n nint(input()) print(f{n}的阶乘为{factorial(n)})逻辑解析以计算5!为例递归的执行过程是 “先递后归”递factorial(5)→ 调用factorial(4)→ 调用factorial(3)→ 调用factorial(2)→ 调用factorial(1)→ 调用factorial(0)归factorial(0)返回 1 →factorial(1)1×11→factorial(2)1×22→factorial(3)2×36→factorial(4)6×424→factorial(5)24×5120。二、斐波那契数列递归解决递推关系问题斐波那契数列是经典的递推数列其核心规律为边界条件第 1 位和第 2 位均为 1F(1)1F(2)1递归关系从第 3 位开始每一位等于前两位之和F(n) F(n-1) F(n-2)。代码实现#第n个斐波那契数 def fibonacci(n): if n1 or n2: return 1 else: return fibonacci(n-1) fibonacci(n-2) nint(input()) print(f第{n}个斐波那契数为{fibonacci(n)})逻辑解析计算第 5 个斐波那契数时递归会拆解为fibonacci(5) fibonacci(4) fibonacci(3)fibonacci(4) fibonacci(3) fibonacci(2)fibonacci(3) fibonacci(2) fibonacci(1)当触达n1或n2的边界条件后开始回溯求和最终得到fibonacci(5)5。注纯递归实现斐波那契数列存在重复计算问题如fibonacci(3)会被计算多次适合理解递归逻辑实际开发中可结合记忆化缓存优化效率。三、全排列问题递归拆解 “选元素 排剩余”全排列是指从 n 个不同元素中取出所有元素按任意顺序排列最终得到所有可能的排列组合。递归解决全排列的核心思路是边界条件若列表只剩 1 个元素其全排列就是自身递归关系遍历列表中的每个元素将其作为 “第一个元素”再对剩余元素递归求全排列最终拼接所有结果。代码实现#全排列问题 def full_permutation(list): if len(list)1: #如果列表中的元素仅有一个那么直接输出 return [list] #返回[list]而非list保证递归拼接类型一致 result[] for i in range(len(list)): #遍历列表 firstlist[i] #选择任意一个作为第一个 restlist[:i]list[i1:] #构造剩余元素组成的列表 for j in full_permutation(rest): #递归对剩余元素组成的列表如上操作接着第二个位置往后依次添加 result.append([first]j) #将元素依次添加到result中 return result #用eval解析输入字符串为真正的列表 listeval(input(请输入列表例如[1,2,3]:)) for p in full_permutation(list): print(p)逻辑解析以列表[1,2,3]为例先选 1 作为第一个元素剩余[2,3]递归求[2,3]的全排列[[2,3],[3,2]]拼接得到[[1,2,3],[1,3,2]]再选 2 作为第一个元素剩余[1,3]递归求全排列后拼接得到[[2,1,3],[2,3,1]]最后选 3 作为第一个元素剩余[1,2]递归求全排列后拼接得到[[3,1,2],[3,2,1]]所有结果合并得到[1,2,3]的 6 种全排列。四、汉诺塔问题递归解决 “分步移动” 类问题汉诺塔是递归的经典应用问题规则为有 A、B、C 三根柱子A 柱有 n 个大小递减的盘子大盘在下、小盘在上每次只能移动 1 个盘子且任何时候大盘不能放在小盘上目标是将 A 柱所有盘子移到 C 柱B 柱作为过渡。递归解决汉诺塔的核心思路边界条件若只有 1 个盘子直接从 A 移到 C递归关系先将 A 柱上 n-1 个盘子从 A 移到 B以 C 为过渡将 A 柱最后 1 个大盘移到 C再将 B 柱上 n-1 个盘子从 B 移到 C以 A 为过渡。代码实现#汉诺塔问题 def hanoi(n,start,mid,end): if n1: #只有一个盘子直接从start移动到end print(start,--,end) #代表从start处移动一个盘子到end处 return #先把把上面的n-1个盘子移动到mid处才能移动最下面的那个最大的盘子注意顺序 hanoi(n-1,start,end,mid) print(start,--,mid) #再把中间的n-1个移动到end进行递归操作 hanoi(n-1,mid,start,end) nint(input()) if __name__ __main__: hanoi(n,A,B,C)逻辑解析以 n2 为例执行过程调用hanoi(1,A,C,B)触发边界条件打印A -- B打印A -- B移动第 2 个盘子调用hanoi(1,B,A,C)触发边界条件打印B -- C最终完成 2 个盘子从 A 到 C 的移动实际输出可结合规则验证步骤合理性。递归算法核心总结递归三要素明确边界条件递归出口避免无限递归、定义递归关系将大问题拆为小问题、确定返回值保证回溯时能正确拼接结果执行逻辑始终遵循 “先递后归”—— 先逐层拆解问题到边界条件再从边界条件开始回溯计算最终得到原问题答案适用场景适合解决具有 “重复子结构” 的问题如阶乘、斐波那契、全排列、汉诺塔但需注意递归深度Python 默认递归深度有限和重复计算问题必要时结合缓存、迭代优化。递归的本质是 “自顶向下” 的问题拆解掌握它不仅能简化代码更能培养 “分而治之” 的编程思维。建议结合上述实例手动推演执行过程理解每一步的 “递” 与 “归”真正吃透递归的核心逻辑。

相关新闻

DSP280049C串口升级方案大揭秘

DSP280049C串口升级方案大揭秘

DSP280049C串口升级方案 串口升级方案,提供bootloader源码,上位机,用户示例工程,操作说明书。 提供。在嵌入式开发的世界里,设备的升级一直是个重要的话题。今天咱就来聊聊DSP280049C的串口升级方案,这个方…

2026/5/17 10:27:13 阅读更多 →
双馈风力发电机在Matlab/Simulink中的建模与分析

双馈风力发电机在Matlab/Simulink中的建模与分析

利用 Matlab/Simulink 平台搭建双馈风力发电机在电网中的模型,双馈风力发电机在风速变化的影响下转矩、电流、电压等参数波形变化。 适用于风电并网时对风电场影响的研究。 详情请见文档。最近在研究风电并网相关课题,和大家分享一下利用Matlab/Simulink…

2026/5/17 10:27:12 阅读更多 →
做 AI 应用,为什么我越来越建议先接一个稳定的 API 聚合层?

做 AI 应用,为什么我越来越建议先接一个稳定的 API 聚合层?

这半年做 AI 应用,一个很明显的感受就是: 模型能力已经不是最难的问题了,真正折腾人的,是接口兼容、成本控制、模型切换、以及可用性波动。 我自己前后接过 OpenAI、Claude、Gemini、DeepSeek、GLM、Qwen、Kimi、Grok 等不同模型。…

2026/5/17 10:27:11 阅读更多 →

最新新闻

2026年AI写歌软件实测 中文创作哪款效果最好

2026年AI写歌软件实测 中文创作哪款效果最好

2026年AI音乐创作已经彻底走进大众视野,从随手记录日常心情、制作短视频BGM,到独立音乐人打磨原创Demo、商用发行正式单曲,AI写歌软件都成了高效的创作工具。但很多国内用户在挑选时都容易踩坑:海外头部工具中文咬字跑调、访问不稳…

2026/7/3 10:19:06 阅读更多 →
Java计算机毕设之基于 SpringBoot 的企业薪酬发放与固定资产盘点管理系统 公司财务收支与员工绩效考评管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之基于 SpringBoot 的企业薪酬发放与固定资产盘点管理系统 公司财务收支与员工绩效考评管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 10:19:06 阅读更多 →
Xshell四

Xshell四

ps 静态查看进程 用途:一次性快照输出当前系统所有进程信息,属于静态查看,执行一次就结束,常用于搭配管道筛选进程。(特定时间点) 核心参数用法: -e参数指定显示所有运行在系统上的进程&#xf…

2026/7/3 10:17:03 阅读更多 →
基于虚拟机的Python Web自动化测试环境搭建与配置指南

基于虚拟机的Python Web自动化测试环境搭建与配置指南

1. 项目概述:为什么需要一个标准化的自动化测试环境?如果你是一名Web开发者或者测试工程师,每天手动在Chrome、Firefox、Safari以及各种版本的浏览器上重复点击、输入、验证,很快就会感到疲惫不堪且效率低下。更别提还要考虑不同操…

2026/7/3 10:09:00 阅读更多 →
【紧急更新】2024软考论文新大纲适配模板:3类新型命题(AI治理/信创迁移/云原生)专用结构包

【紧急更新】2024软考论文新大纲适配模板:3类新型命题(AI治理/信创迁移/云原生)专用结构包

更多请点击: https://intelliparadigm.com 第一章:软考论文新大纲核心变化与适配策略 2024年起,全国计算机技术与软件专业技术资格(水平)考试高级资格“信息系统项目管理师”论文科目正式启用全新写作大纲。本次调整不…

2026/7/3 10:06:59 阅读更多 →
如何快速定位Windows热键冲突:专业检测工具终极指南

如何快速定位Windows热键冲突:专业检测工具终极指南

如何快速定位Windows热键冲突:专业检测工具终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾经…

2026/7/3 10:04:57 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻