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

专题一:汉诺塔问题:递归算法的精妙解析

请先看我的回溯算法的第一篇文章

以leetcode汉诺塔问题讲解

题目分析: 

 有三根柱子,一开始所有的盘子都在A柱子,并且最底下的最大,最上面的最小

我们要把盘子借助b,移到c的柱子上,每次只能移一步,并且保证小的在大的上面

算法原理:

第一我们要想明白为什么这道题可以用递归的方式解决???

 

可以自己试着分析一下,每次增加一个盘,都是在重复相同的子问题

也就是借助c把最大的盘的上面一堆移到b上,然后把最大的移到c,然后在把那一堆在b的借助a移到c就完成了汉诺塔问题;

此时我们发现某一个主问题可以分成相同的子问题(解决n=4的情况出现了n=3的情况,解决n=3的情况出现了n=2的情况,依次往下递归)

此时就可以用递归来解决 

 我们可以发现:我们都是将一堆盘子从一个柱子(x)借助某个柱子(y)移到另一个柱子(z)上

这样我们就可以设计我们的dfs函数,函数四个参数,三个柱子和要移动的盘子数

dfs函数的作用:完成将一堆盘子从一个柱子(x)借助某个柱子(y)移到另一个柱子(z)上

 

我们需要关系某个子问题:这样想,当N=n时

第一我需要把n-1个盘子借助z移到y上,传参要注意x/y/z

如何借助z转移到y上,我管你,dfs函数的任务就是这样,你要相信它能够完成

第二把第n个盘移到c上

第三把y的盘子借助x移到z上

这样三步就完成了递归 

 

通过观察发现,只有当n=1的时候和n=2/3/4/5的操作不一样,说明n=1的时候是出口

直接当n=1的时候,移到z盘即可

 代码编写

 递归图

可以自己尝试画着理解一下(但最好从宏观看待递归问题,也就是只要清楚dfs能完成什么任务)

 

http://www.xdnf.cn/news/5405.html

相关文章:

  • PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)
  • 【LwIP源码学习6】UDP部分源码分析
  • [思维模式-28]:《本质思考力》-8- 两种相反的构建与解构系统的思维模式:①自顶向下的分解、牵引;②自底向上的堆叠、聚合
  • 深入剖析 MyBatis 位运算查询:从原理到最佳实践
  • AI文字识别工具汇总
  • 控制LED灯设备
  • Linux epoll 详解:概念、使用、数据结构、流程及应用
  • C++:友元
  • CSS 基础知识分享:从入门到注意事项
  • 50.辐射抗扰RS和传导抗扰CS测试环境和干扰特征分析
  • Vue:生命周期钩子
  • 海上风电场数字孪生,可视化智慧运维
  • 20242817李臻《Linux⾼级编程实践》第9周
  • 鸿蒙开发RelativeContainer自适应高度
  • HTTP3详解
  • MySQL为什么选择B+树
  • TikTok 互动运营干货:AI 助力提升粘性
  • Next.js框架学习系列之一
  • Vue 中el和data的两种写法
  • 基于神经网络的无源雷达测向系统仿真实现
  • Transformer KV缓存优化(MHA、MQA、GQA、MLA,参考:DeepSeek-V2)
  • GitHub 趋势日报 (2025年05月10日)
  • 【音视频工具】MP4BOX使用
  • GO语言内存管理结构
  • 远程服务器pycharm运行tensorboard显示训练轮次图
  • 【多模态】IMAGEBIND论文阅读
  • 数据分析基础:需要掌握的入门知识
  • python 实现sha加密
  • 数字电子技术基础(五十七)——边沿触发器
  • 用统计零花钱的例子解释:Shuffle 是啥?