汉诺塔原理用python程序实现的简述

         今天看到了用python去破解汉诺塔的视频,感觉非常的有意思。作为一名初学者,在看完这个视频以后,觉得非常有意思。于是希望用自己的理解去讲解一下这个过程,作为对学过的知识的一个巩固,也作为自己学习python道路上的一个记录。

        首先我们要先清楚汉诺塔的玩法。关于汉诺塔的什么什么历史之类的故事我就不再赘述了,这里主要讲解一下它的玩法。首先就是有三根柱子,这里我给他们编号为ABC。现在A柱子上有若干个圆盘,其余两根柱子上是空的,而我们的目的就是要将A柱子上的圆盘全部移到C柱子上。注意!初始状态时A柱子上的圆盘是按照从上往下从小到大的顺序摆放的,而我们移动时一次只能移动一个圆环,且不能将大的圆环移动到小的圆环上面。具体可以结合我画的图来理解。

        首先就是最简单的两个圆盘的情况,这个相信所有人都能理解,就是先将A最上面的圆盘移动到B,然后把A剩下的圆盘移动到C,最后将B上的圆盘移动到C就完成了所有的移动步骤。       

        接下来我们来试着分析一下三个圆盘的情况。这时候我们移动圆盘的顺序如图所示:汉诺塔原理用python程序实现的简述_第1张图片

 这些步骤看似繁琐,其实非常容易理解。首先我们要将三个圆盘从A移动到C,意味着我们需要将A最上面的两个圆盘先移动到B,然后将最下面的圆盘移动到C,再将B上的两个圆盘移动到C上来。那么现在我们通过这个方法巧妙地将移动三个圆盘的问题化简为移动两个圆盘的问题。

        同理,对于n个圆盘的情况,我们可以先将问题降级为n-1个圆盘的情况,然后不断降级直到降级为移动两个圆盘的情况,这个时候问题就从原来的繁琐复杂变得可操作了。那么降级的思路如图:汉诺塔原理用python程序实现的简述_第2张图片

 这样我们就把原先n个圆环的问题化简为移动n-1个圆环的问题了。同样当我们想把A上面n-1个圆环移动到B,那么我们应该先将A上面n-2个圆环移动到C,然后循环图上的步骤可以实现将A上面n-2个圆环移动到C的目的,这样就把问题再次降级了。循环往复我们便可以将问题降级为最简单的两个圆环的问题,使原本复杂的问题变得可操作。

        那么了解了汉诺塔的移动原理以后我们便可以开始尝试用python语言来描述这个移动的过程,具体代码如图:汉诺塔原理用python程序实现的简述_第3张图片

 首先我们定义了一个函数hanoi(n,x,y,z),n表示圆环的数量,x、y、z表示的是三根柱子。那么当n为1,也就是只有一个圆环的情况下,我们可以直接将圆环从x移动到z。当n大于1的时候,我们就需要进行一个循环降级的操作,那在代码中采用了递归的方式来实现这个降级的操作。当n大于1的时候,函数会调用自己本身,也就是第五行的hanoi(n-1,x,z,y),来实现将x上n-1个圆环移动到y上。至于为什么xyz的顺序变了,因为函数在运行中我们输出的只是从x移动到z,也就是从第二个参数移动到第四个参数,因此当我们需要将圆环整体移动到不同的位置时,需要改变函数形参的位置。

        那么具体运行的结果如图所示:汉诺塔原理用python程序实现的简述_第4张图片

 

 

你可能感兴趣的:(python)