鱼C论坛

 找回密码
 立即注册
查看: 13466|回复: 14

[技术交流] 做汉诺塔的移动练习的一点点感悟

[复制链接]
发表于 2015-6-11 22:21:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wwsw0105 于 2015-6-11 22:32 编辑

练习题:
汉诺塔的移动可以用递归函数非常简单地实现。

请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法

看到这题时首先去百度了下‘汉诺塔‘,看到百度后的结果,瞬间好迷茫,怎么搞?好复杂的样子!最后参照百度答案,把代码打出来了。做完这题时最深的感触就是思维亟待改变,思维通了,这问题简单的很,思维不通,只有抓耳挠腮的份。前方的路还有好远,啥时候才能做个自己的小程序啊?继续努力吧。鱼友们谁有适合新手练习的题目或好网站分享下呗

  1. # 汉诺塔思想笔记
  2. # 认识汉诺塔的目标:把A柱子上的N个盘子移动到C柱子
  3. # 递归的思想就是把这个目标分解成三个子目标
  4. # 子目标1:将前n-1个盘子从a移动到b上
  5. # 子目标2:将最底下的最后一个盘子从a移动到c上
  6. # 子目标3:将b上的n-1个盘子移动到c上
  7. # 然后每个子目标又是一次独立的汉诺塔游戏,也就可以继续分解目标直到N为1
  8. def move(n, a, b, c):
  9.     if n == 1:
  10.         print(a, '-->', c)
  11.     else:
  12.         move(n-1, a, c, b)# 子目标1
  13.         move(1, a, b, c)# 子目标2
  14.         move(n-1, b, a, c)# 子目标3
  15. n = input('enter the number:')
  16. move(int(n), 'A', 'B', 'C')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-12 16:56:17 | 显示全部楼层
我看这个题目是跟你一样,非常不理解,理解后就了然,我也对学习python感到迷茫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-12 22:43:59 | 显示全部楼层
其实我到现在也没懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 17:30:51 | 显示全部楼层
表示理解困难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-11 20:32:55 | 显示全部楼层
是呀。。不知道什么时候可以学出点自己的东西来~不过跟着老师的课会慢慢厉害起来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 13:05:11 | 显示全部楼层
原理清楚,但是hannuota(n-1,x,z,y)和hannuota(n-1,y,x,z)这块具体是个什么情况确实有点懵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-8 22:33:38 | 显示全部楼层
研究了半个小时,有点感觉了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-9 08:51:12 | 显示全部楼层
哈雷行者 发表于 2016-10-14 13:05
原理清楚,但是hannuota(n-1,x,z,y)和hannuota(n-1,y,x,z)这块具体是个什么情况确实有点懵

如果你对这个递归参数的改变有疑惑,你可以这么理解
hannuota(n-1,x,z,y)等价于
x,y,z = x,z,y
hannuota(n-1,x,y,z)

hannuota(n-1,y,x,z)等价于
x,y,z = y,x,z
hannuota(n-1,x,y,z)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-16 16:56:50 | 显示全部楼层
jerryxjr1220 发表于 2016-12-9 08:51
如果你对这个递归参数的改变有疑惑,你可以这么理解
hannuota(n-1,x,z,y)等价于
x,y,z = x,z,y

阔以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 10:50:14 | 显示全部楼层
jerryxjr1220 发表于 2016-12-9 08:51
如果你对这个递归参数的改变有疑惑,你可以这么理解
hannuota(n-1,x,z,y)等价于
x,y,z = x,z,y

但是我想问下,为什么这个代表着把n-1个盘子移动到y针呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 10:51:32 | 显示全部楼层
jerryxjr1220 发表于 2016-12-9 08:51
如果你对这个递归参数的改变有疑惑,你可以这么理解
hannuota(n-1,x,z,y)等价于
x,y,z = x,z,y

这代码代表的意思是把y针和z针互换吗?不好意思我这有点困惑,望解答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 10:56:33 | 显示全部楼层
herbortH 发表于 2017-12-8 10:50
但是我想问下,为什么这个代表着把n-1个盘子移动到y针呢?


把n-1个盘子看成一个整体,你不用去管n-1个盘子怎么去移动,那么这时所有的盘子就变成了第n个盘子和n-1个盘子(整体),这时候应该怎么移动?你自己试一下就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 11:25:30 | 显示全部楼层
jerryxjr1220 发表于 2017-12-8 10:56
把n-1个盘子看成一个整体,你不用去管n-1个盘子怎么去移动,那么这时所有的盘子就变成了第n个盘子和n-1 ...

非常感谢,但是我知道原理,但是else中代码我看不太懂,
        move(n-1, a, c, b)# 子目标1
        move(1, a, b, c)# 子目标2
        move(n-1, b, a, c)# 子目标3
这里a,b,c代表着什么?例如子目标1的代码是将b和c柱子互换吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 11:34:14 | 显示全部楼层
herbortH 发表于 2017-12-8 11:25
非常感谢,但是我知道原理,但是else中代码我看不太懂,
        move(n-1, a, c, b)# 子目标1
        ...

move(n, a, b, c)的意思是把n个盘子从a柱,借b柱,移动到c柱。
那么同理,move(n-1, a, c, b)的意思就是把n-1个盘子从a柱,借c柱,移动到b柱。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 11:49:19 | 显示全部楼层
jerryxjr1220 发表于 2017-12-8 11:34
move(n, a, b, c)的意思是把n个盘子从a柱,借b柱,移动到c柱。
那么同理,move(n-1, a, c, b)的意思 ...

懂了懂了!!!感谢大神!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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