[算法设计与分析-从入门到入土] 递归

算法设计与分析-从入门到入土 递归

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

文章目录

  • [算法设计与分析-从入门到入土 递归](#[算法设计与分析-从入门到入土] 递归)
  • 递归recursion
  • 1.归纳法Induction
        • [以选择排序求解数组 `A1...n`为例](#以选择排序求解数组 A[1...n]为例)
        • [全排列生成generating permutation](#全排列生成generating permutation)
  • [2.分治法divide and conquer](#2.分治法divide and conquer)
  • [3.动态规划dynamic programming](#3.动态规划dynamic programming)

递归recursion

递归技术存在三种特殊情况:

  1. 归纳法Induction: 数学证明中的归纳思想
  2. 非重叠子问题Nonoverlapping: 分治法(拆成p个子问题)
  3. 重叠子问题overlapping: 动态规划(自底向上)(以空间换取时间)

1.归纳法Induction

核心思想:

对于参数为n的问题, 先假设 "参数小于n的子问题已解决"(归纳假设), 再将子问题扩展到参数为n的情况

以选择排序求解数组 A[1...n]为例

归纳假设:假设长度为 n-1 的子数组 A[1...n-1] 已能成功排序

原问题转化:要解决长度为 n 的原数组排序,只需先在整个数组 A[1...n] 中找到最小值 min,将其与数组第一个元素交换位置;此时原数组被拆分为"已确定有序的最小值 min"和"待排序的子数组 A[1...n-1]"

m i n , A \[ 1... n − 1 \] \] \\big\[ min, A\[1...n-1\] \\big\] \[min,A\[1...n−1\]

通过这一过程,原问题的规模从n 缩小到 n-1,最终可递推至规模为 1(单个元素天然有序)的基准情况,完成整个排序

通过递推式计算比较次数:
C o m p a r e ( n ) = { 0 n = 1 ( n − 1 ) + C ( n − 1 ) n ≥ 2 = n ( n − 1 ) 2 \begin{align} Compare(n) &= \begin{cases} 0 & n=1 \\ (n-1) + C(n-1) & n \geq 2 \end{cases} \\ &= \frac{n(n-1)}{2} \end{align} Compare(n)={0(n−1)+C(n−1)n=1n≥2=2n(n−1)

全排列生成generating permutation

目的: 给定整数 n n n,生成由数字 1 , 2 , ... , n 1,2,\dots,n 1,2,...,n 构成的所有排列

归纳假设:已能生成 n − 1 n-1 n−1 个元素的所有排列

原问题转化: 将第 n n n 个元素插入到所有可能位置,从而生成 n n n 个元素的排列

  1. 固定数字 1 在首位,递归生成 { 2 , 3 , ... , n } \{2,3,\dots,n\} {2,3,...,n} 的所有排列;
  2. 固定数字 2 在首位,递归生成 { 1 , 3 , ... , n } \{1,3,\dots,n\} {1,3,...,n} 的所有排列;
  3. 依次类推,直到固定数字 n n n 在首位

时间复杂度: Θ ( n ∗ n ! ) \Theta(n*n!) Θ(n∗n!)

空间复杂度: Θ ( n ) \Theta(n) Θ(n)

递推式写成:
f ( n ) = { 0 n = 1 n f ( n − 1 ) + n n ≥ 2 f(n)= \begin{cases} 0 &n=1 \\ nf(n-1)+n & n \geq2 \end{cases} f(n)={0nf(n−1)+nn=1n≥2

令 f ( n ) = n ! h ( n ) f(n)=n!h(n) f(n)=n!h(n),

则 n ! h ( n ) = n ( n − 1 ) ! h ( n − 1 ) + n n!h(n)=n(n-1)!h(n-1)+n n!h(n)=n(n−1)!h(n−1)+n

则 h ( n ) = h ( n − 1 ) + 1 ( n − 1 ) ! < e − 1 h(n)=h(n-1)+\frac{1}{(n-1)!}<e-1 h(n)=h(n−1)+(n−1)!1<e−1

-> f ( n ) < n ! ( e − 1 ) f(n)<n!(e-1) f(n)<n!(e−1)

e.g. 对于集合{1, 2, 3, 4}:

1 234, 2 134, 3 124, 4123,

(12 34), 13 24, 14 23,

(21 34), 23 14, 24 13,

(31 24), 32 14, 34 12,

(41 23), 42 13, 4312,

(123 4), 124 3

(213 4), 214 3

(312 4), 314 2

(412 3), 413 2

(132 4), 134 2,

(142 3), 143 2,

(231 4), 234 1,

(241 3), 243 1,

(321 4), 324 1,

(341 2), 342 1,

(421 3), 423 1,

(431 2), 4321

-> A 4 4 = 24 A_4^4=24 A44=24

2.分治法divide and conquer

  • 找到多数元素
  • 最小 / 最大值查找
  • 第 k 小元素查找

3.动态规划dynamic programming

  • 最长公共子序列问题LCS
  • 全对最短路径问题(All-Pairs Shortest Path)
  • 0/1背包问题Knapsack
相关推荐
xyy1233 分钟前
C# Polly 弹性策略库指南
算法
霸道流氓气质4 分钟前
CodeBuddy中配置Redis MCP 连接与排错实战
数据库·redis·缓存
水如烟5 分钟前
孤能子视角:三十六计之连环计——拓扑结构重构
人工智能
茶马古道的搬运工10 分钟前
MiniMax Agent Team 深度解析:用对抗式多 Agent 架构解决长程任务
人工智能
程序猿编码11 分钟前
没有AI框架,没有GPU,一个C语言文件跑通大模型
c语言·开发语言·人工智能·深度学习·ai·大模型
程序媛kelly12 分钟前
.xml / .jrxml 文件怎么打开?OpenFiles 实测预览、编辑、搜索与 AI 摘要排查流程
xml·人工智能·jrxml
小弥儿13 分钟前
GitHub今日热榜 | 2026-07-16:AI知识库与反AI味设计成今日双主线
人工智能·学习·github
王琦031819 分钟前
第一章 数据库-理论基础
数据库
何时梦醒20 分钟前
🤖 RAG 文档分割器(Splitter)深度学习笔记 —— 从零搭建知识库文档处理流水线
前端·javascript·人工智能
数行拙笔21 分钟前
Redis---hash类型
数据库·redis·哈希算法