| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 354 人关注过本帖
标题:唉....................难啊!
只看楼主 加入收藏
额外覆盖
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:城市猎人
威 望:6
帖 子:1726
专家分:5757
注 册:2012-9-22
结帖率:97.33%
收藏
已结贴  问题点数:20 回复次数:8 
唉....................难啊!
不知哪位大神能给我详细讲解一下汉诺塔,最好附上代码!拜托了,各位!
搜索更多相关主题的帖子: 最好 
2012-11-19 22:48
额外覆盖
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:城市猎人
威 望:6
帖 子:1726
专家分:5757
注 册:2012-9-22
收藏
得分:0 
还是c语言论坛人气高!自己顶一下!刚才分散了,所以分不高,还请各位大神指点一下!

我现在所学的一切都是为了游戏!!!为了游戏,加油!加油!努力!
2012-11-19 23:00
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:1 
路过

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-11-19 23:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
书中自有详细解

授人以渔,不授人以鱼。
2012-11-19 23:19
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
收藏
得分:2 
你百度一下汉诺塔,写一个递归函数,解决!

WE GO
2012-11-19 23:19
JimQ
Rank: 2
来 自:甘肃定西
等 级:论坛游民
帖 子:14
专家分:21
注 册:2012-11-13
收藏
得分:5 
这是一个简单的递归,就是反复调用的意思,慢慢理解,多做些题,
程序代码:
#include <stdio.h>
int main()
{
  void yidong(int n,char one,char two,char three);         // 对yidong函数的声明
  int m;
  printf("input the number of diskes:");
  scanf("%d",&m);
  printf("The step to move %d diskes:\n",m);
  hanoi(m,'A','B','C');
}

void yidong(int n,char one,char two,char three)          // 定义yidong函数 
    // 将n个盘从one座借助two座,移到three座
 {
  void move(char x,char y);       // 对move函数的声明
  if(n==1)
     move(one,three);
  else
    {
    yidong(n-1,one,three,two);
     move(one,three);
     yidong(n-1,two,one,three);
    }

 }


 void move(char x,char y)           //  定义move函数
 {
   printf("%c-->%c\n",x,y);

 }

2012-11-19 23:31
youngdavid
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:698
注 册:2012-9-24
收藏
得分:10 
anoi(n,a,b,c)
int n;
char a,b,c;
{if (n==1) printf("%c-->%c\n",a,c);
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
}
我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。
先说下这个问题的整体思想:
1,如果只有1个盘,那么就直接把这个盘从A移动到C上。
2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。
3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上, 再把B上的N个盘通过A移动到C上。

if (n==1) printf("%c-->%c\n",a,c);
这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。
else {hanoi (n-1,a,c,b);
如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。
printf ("%c-->%c\n",a,c);
把剩下的第N个盘,从A移动到C上。

hanoi (n-1,b,a,c);}
再把剩下的在B上的N-1个盘,通过A移动到C上。

这属于一个递归算法。
现在,N=3。
我们看下程序怎么运行的。
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}

N=3,也就是开始程序会执行
hanoi (2,a,c,b);这句语句。

再看,2还是大于1,所以
程序会继续运行。 注意,这里,为hanoi (2,a,c,b);  C和B 换了位置。
hanoi (2,a,c,b);
我们把数字代入,得出。
根据 N=2,C和B 互换。以及下面的代码,得出
````````````````````````````````````````````````
hanoi(n,a,b,c)
int n;
char a,b,c;
{if (n==1) printf("%c-->%c\n",a,c);
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
}

```````````````````````````````````````````````
hanoi(2,a,c,b)
int n=2;
char a,c,b;
{if (n==1) printf("%c-->%c\n",a,b);
else {hanoi (1,a,b,c);
printf ("%c-->%c\n",a,b);
hanoi (1,c,a,b);}
}  /  这并不是正确的代码,只是为了得出答案而写的一些数据。/
这样, 我们可以看出,程序会先执行
else {hanoi (1,a,b,c);
所以,开始会先输出A  C(中间的符号省略,以下也一样)
然后,再输出
printf ("%c-->%c\n",a,b);   A B
接着,执行
hanoi (1,c,a,b);}      这时候,就是C B了。

也就是说 hanoi(2,a,c,b)  的输出为  AC  AB  CB
你的问题就已经解决了。
接下来再返回第一层:
现在,N=3。
我们看下程序怎么运行的。
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}

这时候,我们再把数字代进去。
现在,N=3。
我们看下程序怎么运行的。
else {hanoi (2,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (2,b,a,c);}

根据上面的结论
/  也就是说 hanoi(2,a,c,b)  的输出为  AC  AB  CB  /
可以看出,先执行第一条语句:
else {hanoi (2,a,c,b);
则输出   AC  AB  CB
再执行第二条语句:
printf ("%c-->%c\n",a,c);
输出  AC
然后执行第三条
hanoi (2,b,a,c);}
根据这里,/  也就是说 hanoi(2,a,c,b)  的输出为  AC  AB  CB  /
字母进行替代后,A变B,C变A B变C。
所以输出的AC  AB  CB 则为  

BA  BC  AC
所以,最终的结果为  AC AB CB AC BA BC AC
中间可能有很多废话,可以不看。
这样算下去,不管多少层都能推算出来,可复杂度会高得难以想像。
2012-11-20 08:12
额外覆盖
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:城市猎人
威 望:6
帖 子:1726
专家分:5757
注 册:2012-9-22
收藏
得分:0 
回复 7楼 youngdavid
谢了,我就是纠结在每一步如果人来移具体如何移,可忘了它是递归,钻牛角尖了!

我现在所学的一切都是为了游戏!!!为了游戏,加油!加油!努力!
2012-11-20 11:40
似水流年去
Rank: 3Rank: 3
来 自:四川
等 级:论坛游侠
帖 子:71
专家分:128
注 册:2012-10-23
收藏
得分:0 
强。

[fly]放牛班的春天[/fly]
2012-11-20 12:45
快速回复:唉....................难啊!
数据加载中...
 
   



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

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