汉诺塔这个函数属实没看懂,有没有大哥给个详解
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:} 首先知道汉诺塔的游戏规则,游戏目标,规则:一次只能移动一个盘,大盘不能放在小盘上。目标:把x轴上的n个盘移动到y盘。
解决方案:递归算法,把n-1盘放y轴,然后把剩余的一个盘移动到z轴
代码解析:当n不等于1,继续调用函数,以n-1,作为参数,直到n等于1,(在这个过程中,x,y,z的参数值是在不断的变动的),然后逐层返回 我改写一下,你能看得懂吗?
#先定义一个 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) 还是看不懂的话,那就来点干货:
(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
风过无痕1989 发表于 2020-12-20 00:14
我改写一下,你能看得懂吗?
#先定义一个 move 函数,有 4 个参数,n 代表有 n 个盘子,x、y、z 对应 X ...
那为什么不能一次移动多个呢?代码里也没说不能呀?
页:
[1]