当前位置: 首页 > news >正文

汉诺塔问题是经典递归问题,其递归关系推导如下

汉诺塔问题是经典递归问题,其递归关系推导如下:

问题定义:将n个圆盘从A柱移动到C柱,借助B柱,每次只能移动一个圆盘且大盘不能放在小盘上

递推关系:

先将n-1个圆盘从A移到B,需要T(n-1)步

再将最大的圆盘从A移到C,需要1步

最后将n-1个圆盘从B移到C,需要T(n-1)步

因此得到递推式:T(n) = 2T(n-1) + 1,初始条件T(1)=1

求解递推式: 展开可得T(n) = 2^n - 1,因此时间复杂度为O(2^n),空间复杂度为O(n)(递归栈深度)

Python实现代码

def hanoi(n, a=‘A’, b=‘B’, c=‘C’):
if n == 1:
print(f"移动圆盘1从 {a} 到 {c}“)
return
hanoi(n-1, a, c, b)
print(f"移动圆盘{n}从 {a} 到 {c}”)
hanoi(n-1, b, a, c)

测试:3个圆盘的移动步骤

hanoi(3)

二、二叉树遍历实现

首先定义二叉树节点结构:

class TreeNode:
definit(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right

1. 前序遍历(根-左-右)

递归实现

def preorder_recursive(root):
res = []
def dfs(node):
if not node:
return
res.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return res

非递归实现(栈)

def preorder_iterative(root):
if not root:
return []
res, stack = [], [root]
while stack:
node = stack.pop()
res.append(node.val)
# 栈是后进先出,先压右子节点再压左子节点
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res

2. 中序遍历(左-根-右)

递归实现

def inorder_recursive(root):
res = []
def dfs(node):
if not node:
return
dfs(node.left)
res.append(node.val)
dfs(node.right)
dfs(root)
return res

非递归实现(栈)

def inorder_iterative(root):
res, stack = [], []
current = root
while current or stack:
# 一直走到最左子节点
while current:
stack.append(current)
current = current.left
current = stack.pop()
res.append(current.val)
current = current.right
return res

3. 后序遍历(左-右-根)

递归实现

def postorder_recursive(root):
res = []
def dfs(node):
if not node:
return
dfs(node.left)
dfs(node.right)
res.append(node.val)
dfs(root)
return res

非递归实现(双栈)

def postorder_iterative(root):
if not root:
return []
stack1, stack2 = [root], []
while stack1:
node = stack1.pop()
stack2.append(node)
if node.left:
stack1.append(node.left)
if node.right:
stack1.append(node.right)
# stack2逆序即为后序遍历结果
return [node.val for node in reversed(stack2)]

复杂度说明

三种遍历的时间复杂度均为O(n)(每个节点访问一次),空间复杂度:

递归实现:最坏情况(链状树)为O(n),平均情况为O(log n)(递归栈深度)

非递归实现:最坏情况为

http://www.jsqmd.com/news/668552/

相关文章:

  • 2026年河北高速护栏选购指南:五大可靠品牌深度解析与采购建议 - 2026年企业推荐榜
  • 2026年4月山西吸塑托盘采购指南:五大实力厂家深度解析与推荐 - 2026年企业推荐榜
  • 实测对比:JDY-23、HC-05、HM-10,三款经典蓝牙模块怎么选?附功耗与距离实测数据
  • 3步搞定Windows软件卸载:Bulk Crap Uninstaller完全指南
  • 基于可解释轻量化多项式网络的脑电热感觉分类系统
  • 【LeetCode刷题日记】:字符串替换技巧揭秘
  • SCTransform vs 传统方法:单细胞亚群分析中的标准化选择与性能对比
  • 天赐范式第16天:【硬核物理】哥本哈根学派沉默了:用纯经典混沌模拟出量子双缝干涉,量子力学统计特性可能是高维相空间混沌投影的观点(附源码)
  • 专业的东莞高新技术企业认定资质办理公司
  • FPGA实战:手把手教你用CORDIC Translate IP核搞定复数转极坐标(附定点数归一化避坑指南)
  • F460低功耗模式实战:睡眠/停止/掉电模式下的PVD配置避坑指南
  • golang如何实现错误预算Error Budget计算_golang错误预算Error Budget计算实现实战
  • 终极指南:OpenCore Legacy Patcher让老旧Mac焕发新生的3大核心操作
  • 基于多目标遗传NSGA-II算法的水火光系统多目标优化调度研究(Matlab代码实现)
  • 专业级硬件控制终极指南:Lenovo Legion Toolkit深度定制与性能优化
  • SQL分组统计时如何处理文本类型聚合_GROUP_CONCAT的用法
  • 基于Voronoi自适应分区的Qlearning强化学习粒子群算法的海上风电场电气系统拓扑优化研究(Matlab代码实现)
  • 记录VSCode开发C#常用插件
  • 罗茨风机选型推荐指南:用过回转鼓风机的人给我推荐口碑品牌好的
  • Day03 完整学习计划 | 阿里云ACP大模型解决方案专家
  • 从零到一:PrimeTime静态时序分析入门指南
  • 为什么DeepMind、OpenAI、清华交叉信息院都在抢建“证明优先”AGI架构?——2026奇点大会核心议程深度泄露(含3份签署NDA的架构图)
  • 2026年4月浙江企业采购指南:实力激光笔品牌深度测评与推荐 - 2026年企业推荐榜
  • 前瞻2026:江阴市爱维叶幼儿园(托育服务一体化)如何定义下一代托育标准? - 2026年企业推荐榜
  • 基于NSGA-2算法的水火光系统多目标优化调度研究(Matlab代码实现)
  • 如何快速上手Fiji:科学图像分析的终极完整指南
  • 别再折腾软路由了!用OpenWrt 23.05 + Docker Compose,5分钟搞定青龙面板全家桶
  • 从Altium Designer转KiCad 7.0:一个硬件工程师的实战避坑与效率提升指南
  • 2026年4月更新:固体过氧化氢服务商深度解析,为何濮阳圣恺被行业巨头青睐? - 2026年企业推荐榜
  • 【AI Agent实战】我让AI分析了自己3个月的写作风格,发现了5个致命盲区