专题一:汉诺塔问题:递归算法的精妙解析
请先看我的回溯算法的第一篇文章
以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能完成什么任务)