当前位置: 首页 > 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能完成什么任务)

 

http://www.dtcms.com/a/184369.html

相关文章:

  • 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 修改文档(第十七天)
  • HTML5中的Microdata与历史记录管理详解
  • linux内核pinctrl/gpio子系统驱动笔记
  • 第6讲、全面拆解Encoder、Decoder内部模块
  • stm32 WDG看门狗
  • 【人工智能】全面掌控:使用Python进行深度学习模型监控与调优
  • 深入浅出:Spring Boot 中 RestTemplate 的完整使用指南
  • 虚拟内存笔记(三)虚拟内存替换策略与机制
  • 小智AI机器人 - 代码框架梳理2
  • 论文解读:MP-SfM: Monocular Surface Priors for Robust Structure-from-Motion
  • C语言速成之08循环语句全解析:从基础用法到高效实践