鱼C论坛

 找回密码
 立即注册
查看: 7677|回复: 27

[技术交流] 小甲鱼中关于汉诺塔的详细步骤讲解

[复制链接]
发表于 2015-10-9 14:20:33 | 显示全部楼层 |阅读模式

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

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

x
我以n=3为例,七次的打印过程,以及程序执行流程,递归的过程,详细说一下,不想一个个回答!!!

  1. def hanota(n,x='x',y='y',z='z'):
  2.     if n == 1:
  3.         print(x,'-->',z)
  4.     else:
  5.         hanota(n-1,x,z,y)#将前n-1个盘子从x移到y上
  6.         print(x,'-->',z)#将底下的最后一个盘子从x移到z
  7.         hanota(n-1,y,x,z)#将y的n-1个盘子移到z上
  8. hanota(3)
复制代码


这些递归def hanota(3,x='x',y='y',z='z'): 中x,y,z都只是形参,进入递归时 hanota(2,x,z,y),此时实参n=n-1=2,x=x, y=z, z=y的!!!不等于1,进入else,分成3枝(分支1:hannota(2,x,z,y),分支2:print(x,'-->',z),
分支3:hanota(2,y,x,z))
分枝1先运行即:hanota(2,x,z,y),递归不等于1,又分成3枝(1子枝1:hanota(1,x,y,z),
1子枝2:print(x,'-->',y); 1子枝3:hanota(1,z,x,y))
1子枝1先运行:1==1;第一次打印print(x,'-->',z)
1子枝2运行:print(x,'-->',y),第二次打印print(x,'-->',y)
1子枝3运行:hanota(1,z,x,y),1==1,第三次打印print(z,'-->',y)

运行分枝2:print(x,'-->',z),第四次打印:print(x,'-->',z)

运行分枝3(hanota(2,y,x,z)):递归2!=1,又分成3枝,即(3子枝1:hannota(1,y,z,x); 3子枝2print(y,'-->',z); 3子枝3:hanota(1,x,y,z)
再先3子枝1:hannota(1,y,z,x),1==1,第五次打印:print(y,'-->',x)
再次3子枝2:print(y,'-->',z),第六次打印:print(y,'-->',z)
最后3子枝3:hanota(1,x,y,z),1==1,第七次打印:print(x,-->',z)
全部运行完!!

PS:1定义的函数中的n,x,y,z都只是形参,运行函数以及运行中递归调用时给的参数是实参,不要被一会儿x,一会儿y,一会儿z的弄混了,实参是实参,形参中x可以被赋值上实参x,y,z,即变成hanota(2,x=x,y=z,z=y)等。

1子枝1再次递归 hanota(1)时,这时的实参是n=1,x=x,y=z=y(因为hanota(2)中换了一次,这次又换回来了),z=y=z(第二次中z变成y了,这时又换回来了),因而实参成了
x=x,y=y,z=z, 1 == 1,即第一次的打印print(x,'-->',z),此时x即为x,z即为z。

2小甲鱼的汉诺塔是将盘子从x最终都移到z的,下面这个是将盘子从x最终都移到y上!
  1. def towers(n,x='x',y='y',z='z'):
  2.     if n == 1:
  3.         print('把盘子从 ',x,'移到 ',y)
  4.     else:
  5.         towers(n-1,x,z,y)
  6.         towers(1,x,y,z)
  7.         towers(n-1,z,y,x)
复制代码

  1. >>> towers(3)
  2. 把盘子从  x 移到  y
  3. 把盘子从  x 移到  z
  4. 把盘子从  y 移到  z
  5. 把盘子从  x 移到  y
  6. 把盘子从  z 移到  x
  7. 把盘子从  z 移到  y
  8. 把盘子从  x 移到  y
  9. >>>
复制代码

评分

参与人数 4荣誉 +17 鱼币 +17 贡献 +13 收起 理由
风铃- + 5 + 5 + 3 鱼C有你更精彩^_^
zhh0707 + 5 + 5 + 3
拈花小仙 + 2 + 2 + 2 支持楼主!
~风介~ + 5 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-9 15:30:53 | 显示全部楼层
领教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-9 17:11:17 | 显示全部楼层
:shock:感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-9 18:47:17 | 显示全部楼层
好,主要是表现形式难以表现,现在思路清蜥了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-9 21:28:58 | 显示全部楼层
感謝 終於了解了 但是當要了解其中規則 整理出來  對我來說還是挺難的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-22 13:56:26 | 显示全部楼层
谢谢!!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-7 12:02:11 | 显示全部楼层
支持,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 17:14:38 | 显示全部楼层
这个帖子真不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 09:48:59 | 显示全部楼层
强帖要顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-25 19:19:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-29 21:59:57 | 显示全部楼层
表示汗颜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-5 15:10:57 | 显示全部楼层
厉害厉害 !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-5 17:11:07 | 显示全部楼层
谢谢分享~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 17:58:31 | 显示全部楼层
看了这个详细分解后懂了。谢谢LZ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-8 21:58:10 | 显示全部楼层
谢谢楼主,我自己推到脑袋都大了,一下子捋清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-14 13:50:27 | 显示全部楼层
见识了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-24 11:09:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-24 19:45:32 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-10 16:44:19 | 显示全部楼层
写的很详细,我再多看几遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 13:58:20 From FishC Mobile | 显示全部楼层
受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 04:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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