汉诺塔问题就是有三个柱子,一个柱子上有n个盘子,逐渐变大,要将这n个盘子从a柱通过b柱转移到c柱上去,并且大盘子不能压在小盘子上。如何解决?
一、这是一个递归问题,学习了知乎的一些回答:
1.最重要的一点!对于递归的理解在于放弃!放弃自己对理解和跟踪递归全程的企图。我就是没有意识到这一点,自我纠结了很久,要知道咱们是人脑不是计算机。
2.递归需要思考的就是递归的两层之间的交接,即递归的有规律的过程步骤和递归的终结条件。
二、解题过程:
1.当有n个盘子需要从a柱子通过b柱放到c柱时,过程就是三个步骤:
(1)将n-1个盘子从a柱通过c柱放到b柱
(2)将第n个盘子从a柱放到c柱
(3)将n-1个盘子从b柱通过a柱放到c柱
2.而我们该如何做(1)将n-1个盘子从a柱通过c柱放到b柱这个步骤呢?重复同样的三个步骤,只是参数发生了变化!
我们可以发现其实所有的动作都可以用一个函数进行定义:我们设定一个函数为move(n,source,temp,target),n为需要移动的盘子的个数,source为当前盘子所在的地方,temp为缓冲柱,target为盘子需要放置的终点。
那么根据1中的三个步骤可以将函数描述为
move(n,source,temp,target):
(1)将n-1个盘子从source柱通过target柱放到temp柱
(2)将第n个盘子从source柱放到target柱
(3)将n-1个盘子从temp柱通过source柱放到target柱
最后我们需要考虑递归的终结条件,就是当n=1的时候,此时只需
汉诺塔问题的解题过程及体会
最新推荐文章于 2023-08-08 22:51:35 发布