| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 608 人关注过本帖
标题:汉诺塔程序执行看不明白,求助!!
只看楼主 加入收藏
account
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:91
专家分:107
注 册:2010-4-12
结帖率:100%
收藏
 问题点数:0 回复次数:5 
汉诺塔程序执行看不明白,求助!!
move(int n,int x,int y,int z)
{
 if(n==1)
   printf("%c-->%c\n",x,z);
 else
  {
   move(n-1,x,z,y);
   printf("%c-->%c\n",x,z);
   move(n-1,y,x,z);
  }
}
main()
{
 int h;
 printf("\ninput number:\n");
 scanf("%d",&h);
 printf("the step to moving %2d diskes:\n",h);
 move(h,'a','b','c');
}
这是汉诺塔的源码,算法我明白,但用程序表示却云里雾里了,假设n=1,那么直接打印a->c,实参与形参对应一致,但是n=2时,执行move(n-1,x,z,y);实参与形参对应发生了变化,但是调用自己什么呢?调用n=1么?那么不就是a->c么?
哪位能以n=2时程序如何执行的详细解释下么?谢谢了
关于n!的递归调用我还能明白,这个递归调用我关键是都不知道调用什么。。。真是羞愧啊

[ 本帖最后由 account 于 2010-4-17 22:53 编辑 ]
搜索更多相关主题的帖子: 汉诺塔 
2010-04-17 22:52
account
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:91
专家分:107
注 册:2010-4-12
收藏
得分:0 
哪位清楚的能否赐教,谢谢了
2010-04-18 00:10
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
n=2的时候调用move函数
此时n=2,x='a',y='b',z='c';
然后判断(n==1)不符合
就调用MOVE函数
此时n=1 x='a',y='c',z='b';(但ELSE中还是x,y,z值都没发生变化还是x='a',y='b',z='c')
然后判断(n==1)符合
输出a->b;
然后是执行ELSEZ中的PRINTF();
输出a->c
然后再printf后面的MOVE函数
此时n=1,x='b',y='a',z='c';
然后判断(n==1)符合
输出c->b;最后代码运行结束
2010-04-18 00:29
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
这种得自己慢慢看  脑海中没有形成这种思想 是很难理解的
2010-04-18 00:50
account
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:91
专家分:107
注 册:2010-4-12
收藏
得分:0 
以下是引用草狼在2010-4-18 00:29:30的发言:

n=2的时候调用move函数
此时n=2,x='a',y='b',z='c';
然后判断(n==1)不符合
就调用MOVE函数
此时n=1 x='a',y='c',z='b';(但ELSE中还是x,y,z值都没发生变化还是x='a',y='b',z='c')
然后判断(n==1)符合
输出a->b;
然后是执行ELSEZ中的PRINTF();
输出a->c
然后再printf后面的MOVE函数
此时n=1,x='b',y='a',z='c';
然后判断(n==1)符合
输出c->b;最后代码运行结束
对与n=2按照您的解释,完全明白,再调用过程中,实参与形参对应发生了改变,输出也随之不同,但是对于n=3呢?
我如果也这样理解,
n=3,x='a',y='b',z='c';
然后判断(n==1)不符合
就调用move函数
此时n=2 x='a',y='c',z='b'//是这样对应吗?
然后判断(n==1)不符合
就再次调用move函数
此时n=1 x='a',y='c',z='b'
然后判断(n==1)符合
接下去就输出a-->bl了??这样就错了啊。。。
我哪里理解出现问题了呢?
2010-04-18 01:29
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
对与n=2按照您的解释,完全明白,再调用过程中,实参与形参对应发生了改变,输出也随之不同,但是对于n=3呢?
我如果也这样理解,
n=3,x='a',y='b',z='c';
然后判断(n==1)不符合
就调用move函数
此时n=2 x='a',y='c',z='b'//是这样对应吗?
然后判断(n==1)不符合
就再次调用move函数
此时n=1 x='a',y='c',z='b'//这错了 应该是n=1 x='a',y='b',z='c'
然后判断(n==1)符合
接下去就输出a-->bl了??这样就错了啊。。。
我哪里理解出现问题了呢?



掉应函数MOVE时  MOVE函数里面的形参是变的(只对调用上去的改变) 但ELSE中的是不变的

就像else
{
   move(n-1,x,z,y);//调用的这个函数的形参会跟着改变(n=1 x='a',y='b',z='c'),但ELSE语句中的X,Y,Z值没边
   printf("%c-->%c\n",x,z);//这里输出的还是函数M0VE(N=2,X='A',Y='C',Z='B')时候的X,Y,Z所对应的值;
   move(n-1,y,x,z);//调用这函数时 形参还是根据M0VE(N=2,X='A',Y='C',Z='B');这里面的X,Y,Z所对应的字母来改变;
}
  反正你记住调用MOVE函数时 函数里面的X,Y,Z值就根据move(n+1)中X,Y,Z所对应的值来改变;
向调用 MOVE(N=2,Z,X,Y)
你就根据move(n=3,x,y,z)中X,Y,Z所对应的值来改变MOVE(n=2)中的形参就OK了


建议回去再看下书 看函数递归是如何实现的

[ 本帖最后由 草狼 于 2010-4-18 09:15 编辑 ]
2010-04-18 09:08
快速回复:汉诺塔程序执行看不明白,求助!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018119 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved