鱼C论坛

 找回密码
 立即注册
查看: 1988|回复: 4

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

[复制链接]
发表于 2020-12-19 23:56:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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')
最佳答案
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-20 00:09:01 From FishC Mobile | 显示全部楼层
首先知道汉诺塔的游戏规则,游戏目标,规则:一次只能移动一个盘,大盘不能放在小盘上。目标:把x轴上的n个盘移动到y盘。
解决方案:递归算法,把n-1盘放y轴,然后把剩余的一个盘移动到z轴
代码解析:当n不等于1,继续调用函数,以n-1,作为参数,直到n等于1,(在这个过程中,x,y,z的参数值是在不断的变动的),然后逐层返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
汉诺塔.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-2 16:44:50 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-20 00:14
我改写一下,你能看得懂吗?

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

那为什么不能一次移动多个呢?代码里也没说不能呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 15:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表