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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值