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

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

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

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

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

参考文章:各方资料

文章目录

  • [[算法设计与分析-从入门到入土] 递归](#[算法设计与分析-从入门到入土] 递归)
  • 递归recursion
  • 1.归纳法Induction
        • [以选择排序求解数组 `A[1...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
相关推荐
薛定猫AI2 小时前
【深度解析】终端里的免费 AI 编程助手 Freebuff:多代理架构、模型路由与安全使用实战
人工智能·安全·架构
tedcloud1235 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
曦月逸霜8 小时前
啥是RAG 它能干什么?
人工智能·python·机器学习
AI医影跨模态组学8 小时前
Lancet Digit Health(IF=24.1)广东省人民医院刘再毅&amp;南方医科大学南方医院梁莉等团队:基于可解释深度学习模型预测胶质瘤分子改变
人工智能·深度学习·论文·医学·医学影像·影像组学
应用市场8 小时前
AI 编程助手三强争霸(2026 版):Claude、Gemini、GPT 各自擅长什么?
人工智能·gpt
浅念-8 小时前
递归解题指南:LeetCode经典题全解析
数据结构·算法·leetcode·职场和发展·排序算法·深度优先·递归
Mahir088 小时前
Redis 与 MySQL 数据同步:一致性保证的完整解决方案
数据库·redis·mysql·缓存·面试·数据一致性
CSND7408 小时前
YOLO resume断点续训(不能用官方的权重,是自己训练一半生成的last.pt)
深度学习·yolo·机器学习
2301_769340678 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
Kiling_07048 小时前
Java集合进阶:Set与Collections详解
算法·哈希算法