鱼C论坛

 找回密码
 立即注册
查看: 1702|回复: 5

关于汉诺塔的代码的疑惑!求大神指导

[复制链接]
发表于 2016-10-1 19:59:12 | 显示全部楼层 |阅读模式

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

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

x
  1. def hanoi(n,x,y,z):                #n代表盘子数量,x,y,z代表相应柱子
  2.     global count                   #申明为全局变量,统计一共要移动盘子的次数
  3.     count += 1
  4.     if n == 1:                     #递归结束条件
  5.         print('%c->%c'%(x,z))      
  6.     else:
  7.         hanoi(n-1,x,z,y)           #将n-1盘子从x借助z移动到y(第一步,复杂,需调用函数)
  8.         print('%c->%c'%(x,z))      #将最后一个盘子从x移动到z(第二步,较为简单,直接打印)
  9.         hanoi(n-1,y,x,z)           #将n-1盘子从y借助x移动到z(第三步,复杂,需调用函数)
  10. count = 0
  11. hanoi(64,'x','y','z')
  12. print('一共需要移动盘子的次数为%d次!'%count)
复制代码


问题:
0、假定f(n)是这个函数,可以吗?函数的变量只有n,对吗?
1、f(n)=hanoi(n,x,y,z)的具体内容是什么?
是默认输出   x->z   吗?是输出移动轨迹   n右1---n右3?
是三个步骤组成的函数吗?

2、在定义f(n)的时候用了f(n-1),我能理解,但是hanoi(n-1,x,z,y) 为什么更换y,z的位置?
是想让输出结果,按照规律n右1---n右3,输出x->y吗?

3、hanoi(64,'x','y','z')里面,x y z为什么加引号?函数定义的时候,为什么没有要求加呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-1 20:38:39 | 显示全部楼层
0、假定f(n)是这个函数,可以吗?函数的变量只有n,对吗?
必须要带x,y,z,只有将这三个参数带到函数中,才能在递归中传递值。

1、f(n)=hanoi(n,x,y,z)的具体内容是什么?
是默认输出   x->z   吗?是输出移动轨迹   n右1---n右3?
是三个步骤组成的函数吗?
x代表移动所在柱子,z代表要移动到的柱子,y代表临时放置的柱子。
2、在定义f(n)的时候用了f(n-1),我能理解,但是hanoi(n-1,x,z,y) 为什么更换y,z的位置?
是想让输出结果,按照规律n右1---n右3,输出x->y吗?
要想把n个从x移动到z,需先把n-1个移动到y,hanoi(n-1,x,z,y) 就是如何把n-1个移动到y

3、hanoi(64,'x','y','z')里面,x y z为什么加引号?函数定义的时候,为什么没有要求加呢?
函数定义时是变量名,函数使用时是变量的值,当然你也可以把'x','y','z'改为'起始位','临时位','目的位'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-1 22:13:10 | 显示全部楼层
冬雪雪冬 发表于 2016-10-1 20:38
0、假定f(n)是这个函数,可以吗?函数的变量只有n,对吗?
必须要带x,y,z,只有将这三个参数带到函数中,才 ...

谢谢版主又来指导。
我还有如下疑惑:
hanoi(n,x,y,z)是不是表示,x所在的位置是起始位,y所在的位置是临时位,z所在的位置是目的位,三个位置是固定的,但是x y z与三个位置的对应关系不是固定,后边会不断变化,比如hanoi(n-1,x,z,y) 表示x是起始位,z却成了临时位,最后y 是目的位,是不是可以这样理解呢?
但是如果上面的理解正确,那么'x','y','z'就不能改为'起始位','临时位','目的位'了,是吗?
大神,我的理解,是不是不对啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-1 22:31:21 | 显示全部楼层
参数2是起始位,参数3是临时位,参数4是目的位,由于递归时x,y,z对于的参数位置是变化的,所以将'x','y','z'作为左中右更好理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-1 22:40:01 | 显示全部楼层
冬雪雪冬 发表于 2016-10-1 22:31
参数2是起始位,参数3是临时位,参数4是目的位,由于递归时x,y,z对于的参数位置是变化的,所以将'x','y','z ...

明白了,那就是我理解的,x y z就是代表左柱子,中柱子,右柱子,每一个柱子会随着移动的需要,变为起始位、临时位或目的位。所以
hanoi(n-1,x,z,y)中,把y,z变换位置,是因为 y 要成为 目的位,也是为了输出将 n-1层从x 移动到 y,  对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-1 22:52:35 | 显示全部楼层
人zai旅途 发表于 2016-10-1 22:40
明白了,那就是我理解的,x y z就是代表左柱子,中柱子,右柱子,每一个柱子会随着移动的需要,变为起始 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 09:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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