胖胖的小阿涵 发表于 2020-12-19 23:56:27

汉诺塔这个函数属实没看懂,有没有大哥给个详解

def han(n,x,y,z):
    if n==1:
      print(x,'-->',z)
    else:
      han(n-1,x,z,y)
      print(x,'-->',z)
      han(n-1,y,x,z)


n=int(input('请输入汉诺塔的层数:'))
han(n,'X','Y','Z')
{:10_243:}

qin_yin 发表于 2020-12-20 00:09:01

首先知道汉诺塔的游戏规则,游戏目标,规则:一次只能移动一个盘,大盘不能放在小盘上。目标:把x轴上的n个盘移动到y盘。
解决方案:递归算法,把n-1盘放y轴,然后把剩余的一个盘移动到z轴
代码解析:当n不等于1,继续调用函数,以n-1,作为参数,直到n等于1,(在这个过程中,x,y,z的参数值是在不断的变动的),然后逐层返回

风过无痕1989 发表于 2020-12-20 00:14:53

我改写一下,你能看得懂吗?

#先定义一个 move 函数,有 4 个参数,n 代表有 n 个盘子,x、y、z 对应 X、Y、Z 三根柱子,如下:
def move(n, x, y, z):
#设定如果 n = 1 的情况,直接打印 x —> z
if n == 1:
print ('请移动:', x, ‘—>’, z)
#如果 n > 1,就要把 n - 1 个盘子移动到 Y 上去(可以经过 z)
move(n - 1, x, z, y)
#然后把剩下的 n 号盘从 X 移动到 Z
print (‘请移动:’, x, ‘—>’, z)
#最后把在B上的 n - 1 个盘子都挪到 Z 上去(可以经过 x)
move(n - 1, y, x, z)

风过无痕1989 发表于 2020-12-20 00:31:22

还是看不懂的话,那就来点干货:
    (1)       n == 1

                  第1次1号盘X---->Z       sum = 1 次

    (2)n == 2

                  第1次1号盘X---->Y

                  第2次2号盘X---->Z

                  第3次1号盘Y---->Z      sum = 3 次

  (3)n == 3

                  第1次1号盘X---->Z

                  第2次2号盘X---->Y

                  第3次1号盘Z---->Y

                  第4次3号盘X---->Z

                  第5次1号盘Y---->X

                  第6次2号盘Y---->Z

                  第7次1号盘X---->Z      sum = 7 次



不难发现规律:1个圆盘的次数 2的1次方减1

       2个圆盘的次数 2的2次方减1

       3个圆盘的次数 2的3次方减1

       。。   。    。   。

       n个圆盘的次数 2的n次方减1

故:移动次数为:2 ^ n - 1

xsszz 发表于 2021-2-2 16:44:50

风过无痕1989 发表于 2020-12-20 00:14
我改写一下,你能看得懂吗?

#先定义一个 move 函数,有 4 个参数,n 代表有 n 个盘子,x、y、z 对应 X ...

那为什么不能一次移动多个呢?代码里也没说不能呀?
页: [1]
查看完整版本: 汉诺塔这个函数属实没看懂,有没有大哥给个详解