1.汉诺塔问题是什么

汉诺塔问题
简而言之:

  • A柱,起始柱,刚开始的n个圆盘全部在A柱上。
  • C柱,目的柱,要将A柱上的所有圆盘全部移动到C柱上。
  • B柱,中转柱,在往C柱移动的过程中,圆盘可以借助B柱转移。

注意:不管在那个柱子上,都遵循一个原则“大盘在下,小盘在上,一次只移动一个圆盘的原则

2.分析问题(从特殊到一般)

(1). 当只有一个圆盘的时

直接将圆盘从A柱移动到C柱

(2).有两个圆盘时

汉诺塔

  1. 第一步
    汉诺塔
  2. 第二步
    汉诺塔
  3. 第三步
    汉诺塔

(3).当有n个圆盘时

这时候当然不会傻乎乎的去画图分析每一步了,要发现它的的本质,将大事化小,也就是递归的思想。什么是递归呢,就是字面意思,先逐层递推,再逐层回归。例如一个下面这个简单的递归案例。
递归求阶乘
先把代码放在这里,思路是:求n!,可以化成n*(n-1)!,n*(n-1)!又可以化成n*(n-1)*(n-2)!,直到1结束。依据上面代码就是先创建一个求阶乘的Factorial函数,返回值为整型,参数为input。进入函数,当input >1时,就返回input*Factorial的值 ,如果不满足要求,就走else,返回1,因为阶乘最后乘的就是1。
示例
关键:逐层递归,逐层返回


再回到汉诺塔问题,有n个圆盘时,我们就可以分为三步

  1. 先将上面的n-1层转移到中转柱上
  2. 再将第n层转移到目标柱上
  3. 最后将n-1层转移到目标柱上

这样表述可能不太明显,请看下面代码
在这里插入图片描述
首先是主函数的实现,这个没什么好说的,就是定义了ABC柱。

在这里插入图片描述
这是定义的Move函数,因为最后呈现出的效果是每一步是怎样移动的,所以只有两个参数,表示pos1上的盘子向pos2移动要注意:这里的pos1和pos2不要想当然的理解成A柱和B柱,他们中间柱子的关系是会发生改变的,下面会讲到


这个函数才是重中之重,当然代码中我也有写注释,希望大家可以理解。
参数pos1,pos2,pos3分别对应起始柱,中转柱和目标柱,这个是不会改变的。
进入Hanoi函数先看n是否等于1,如果等于,直接将pos1和pos3传给Move函数。

  1. 如果不等于1,那就先把上面的n-1个放到中转柱上。注意注意,现在相当于先把中转柱看成了目标柱,而目标柱看成了中转柱,这n-1个圆盘要借助C柱移动到B柱上,所以再次调用函数Hanoi,但是传参的时候pos2和pos3的位置互换了。
  2. 当n-1个圆盘已经放到了B柱上,这是调用Move函数,将A柱上的第n个盘子移动到C柱。
  3. 刚才n-1个圆盘还在B柱上,我们要把他们移动到C柱,这时,B柱变成了起始柱,A柱变成了中转柱,C柱还是目标柱,所以按照Hanoi函数接收参数的顺序传递过去。

3.总结

以上就是这篇文章的全部内容,因为本人也是刚开始写博客,所以可能很多地方会表达不清楚,或者排版之类的会不太美观,希望大家多多包涵。以下我总结一下汉诺塔问题的重点

  • Hanoi函数接收参数的位置是固定的,顺序为起始,中转,目标
  • 理解递归的核心:将大事化小
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐