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

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

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

以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能完成什么任务)

 

相关文章:

  • Spring框架(一)
  • OpenResty反向代理
  • 在Java项目中实现本地语音识别与热点检测,并集成阿里云智能语音服务(优化版)
  • 【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
  • Redis设计与实现——单机Redis实现
  • iVX 平台技术解析:图形化与组件化的融合创新
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十五)
  • 深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
  • java的Stream流处理
  • MySql(进阶)
  • macOS 15 (Sequoia) 解除Gatekeeper限制
  • wget、curl 命令使用场景与命令实践
  • 第八讲 | stack和queue的使用及其模拟实现
  • MySQL 数据库故障排查指南
  • 浏览器的B/S架构和C/S架构
  • 什么是卷积神经网络
  • QtGUI模块功能详细说明,事件与输入处理(五)
  • 无人机飞控算法开发实战:从零到一构建企业级飞控系统
  • JDS-算法开发工程师-第9批
  • Linux | Uboot-Logo 修改文档(第十七天)
  • 美国4月CPI同比上涨2.3%低于预期,为2021年2月来最小涨幅
  • 刘永明|在从普及到提高中发展新大众文艺
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • 法治日报:炮制师生日常剧本,校园怎么成了短视频流量秀场?
  • 法院就“行人相撞案”道歉:执法公正,普法莫拉开“距离”
  • 阶跃星辰CEO姜大昕:追求智能上限仍是最重要的事,多模态的“GPT-4时刻”尚未到来