汉诺塔问题:有三根柱子,a柱, b柱, c柱,a柱上有任意n个大小不一的圆盘,从上到下按从小到大摆放。要求:将所有圆盘从a转移至c,且顺序与起始时盘子放置顺序一样(从上到下按从小到大摆放)。打印所有转移步骤。(要求:在转移过程中,小盘子必须在大盘子上面,大盘子不能出现在小盘子上。)

①最简单的情况,n=1时,操作为:a-->c,即“起始位置”设为a,“目标位置”设为c。打印“起始位置”-->“目标位置”。写成函数即为:

def move(n, a, b, c): #函数有4个参数,第一个参数为盘子个数,第二个参数为起始位置的名称,第三个参数为过渡位置的名称,第四个参数为目标位置的名称

    if n ==1: #只有一个盘子的情况

        print(a,'-->', c) #直接打印起始位置指向目标位置。

②比第一种情况复杂点,n=2时。思路:

第一步:除最大盘子放到过渡位置上,n-1=1个盘子需要做的事。(这里,因为move函数只干一件事,当n=1时,将move函数的第二个参数(起始位置)指向第四个参数(目标位置),将起始位指向目标位,所有,我们就要将位置的名称改一下了,move函数的第二个参数(起始位置)的名称还是a,但第三个参数(过度位置)的名称应改为c,第四个参数(目标位置)名称改为b(也就将函数第三四个参数位置互换)。函数就写为move(n-1,a, c, b),(此时,每当python对函数参数进行定以一次,n就减1,直到发现,欸,此时n=1,就执行将move函数n=1的情况),将第二个参数(起始位置)指向第四个参数(目标位置)[a,'-->',b]。

第二步:将最大的盘子放到目标位置上。上一步做了将n-1=1个盘子放到过渡位置上了,现在就要将仅剩的最大的盘子移到c上,直接语句print(a,'-->', c)。(因为最大的盘子我们没有动过,一直在a柱上,n-1=1个盘子也已经放到过渡位置上了,这一步直接使用print语句打印a'-->'c就行)

第三步:上面将最大的盘子放到c盘了,就要将剩下的n-1=1个挪回c柱上了,此时再来改一改move函数不同参数的名称,这时候,盘子在过渡位置上,也是在b上的,所以move函数第二个参数(起始位置)应该是b,move函数第三个参数(过渡位置)应该是a,move函数第四个参数(目标位置)应该是c,此时,函数写为move(n-1, b, a, c),程序就是改名,n-1,改名,n-1,直到发现,欸,n=1,执行move函数n=1的情况,将第二个参数(起始位置)指向第四个参数(目标位置),此时就是b'-->'c.

 

 

完整代码:

def move(n, a, b, c): #定义函数move,第一个参数为盘子个数,第二个为起始位置名称,第三个参数为过渡位置名称,第四个参数为目标位置名称。

  if n == 1: #当n为1时,直接第二个参数指第四个参数。

    print(a, '-->', c)

  else:

    move(n-1, a, c, b) #当 n!=1时,对函数的参数改名字啦!(一直改,改到最后,改到n=1时,执行n=1时的情况),改完也就将n-1个挪到b上啦

    print(a,'-->', c) #将最大的盘子从a挪到c

    move(n-1, b, a, c) #都把n-1个盘子放到b上怎么不放“回去”呢, 这里放回去根第一步一样啦,不过起始位置已经是在b上啦,目标位置时c,剩下来过渡位置就是a啦。

总结就是:n>1,时,分为三步,①将n-1个放到过渡位置b柱上,写为move(n-1, a, c, b)

              ②将剩下一个放到目标位置c上,写为print(a,'-->', c)

              ③将n-1个从过渡位置b柱上放回c上,写为move(n-1, b, a, c)