| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1203 人关注过本帖
标题:汉诺塔的程序把我弄迷糊了!高人指点一下!
只看楼主 加入收藏
zwlcdh
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-2-8
收藏
 问题点数:0 回复次数:9 
汉诺塔的程序把我弄迷糊了!高人指点一下!
/*输出汉诺塔移动的步骤*/
#include<stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to moveing %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if (n==1) move(one,three);
else
{hanoi(n-1,one,three,two); /*这里明白是怎么回事*/
move(one,three);/*这开始就不是很清楚了,希望有人能指点一下下*/
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);;
}

[此贴子已经被作者于2007-2-10 9:39:38编辑过]

搜索更多相关主题的帖子: 汉诺塔 高人 
2007-02-10 09:38
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 
我理解的汉诺原理是这样:
当n=3,目的是把第3个盘子搬到C上A->C,而第3个盘子上还有两个盘子,所以先要把上面的两个盘子搬到B上
A->B,然后才能把第3个盘子搬到C上A->C,最后把B上的的两个盘子搬到C上B->C;
当递归执行时,每次调用函数都假设当事盘在A上最后一层,依次类推.

2007-02-10 10:34
jishuai
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2006-12-15
收藏
得分:0 
它其实就是一个递归原理啊
到条件不成立的时候.再一步一步的反回调用点啊

2007-02-10 21:12
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
哇,和我一样,我刚开始也是被整的够戗.现在我稍微弄懂了一些,就来说说吧.我就直接说你弄不懂的地方:

"move(one,three);/*这开始就不是很清楚了,希望有人能指点一下下*/"

这句的的意思是这样的:假设我们定义3个放盘子的地方,分别为one,two,three,one上面有n个盘子."mouve(one,three)"的上一句"hanoi(n-1,one,three,two);"说明我们把n-1个盘子通过three移动到two,这时one上面只剩下1个盘子,而three上面没有盘子,这样我们就可以利用语句"move(one,three);"把one上的那个盘子移动到three上面,然后再通过语句"hanoi(n-1,two,one,three);"把two上的盘子都通过one移动到three,这样就达到了我们的要得效果.而怎样把two上的盘子移动到three上呢,那么我们可以继续调用函数,这样就形成递归.

哎,我的表达能力有限,虽然极力想说清楚,但是看来只能到这个水平了,不知道你能不能看动,哈哈.

2007-02-10 23:29
zwlcdh
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-2-8
收藏
得分:0 
原理我也明白!只是按这个程序往下想,有点蒙了!不知道这个算法是怎么想出来的!~!
楼上的说的让我有点明白了!!多谢了哈!
2007-02-11 12:36
genie2014
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-6-21
收藏
得分:0 
不用谢,其实这个问题让我也迷糊了好长时间,反复的想想,然后跟着程序多走几遍就会理解的深刻一些了.哈哈

2007-02-11 13:27
longhupeng0
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-2-11
收藏
得分:0 
你运用[逆向推理]想一下,或许会有点收获
2007-02-11 20:00
乘风摘月
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-2-16
收藏
得分:0 

谢谢解释!

2007-02-16 17:04
a370413564
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2008-1-3
收藏
得分:0 
你们能不能讲清楚点啊。..!
  
  我也晓得原理啊..!
   
 只要一跟程序就晕了..!
   
   有没有详细点的...能跟得上程序的脚步的..!
2008-10-23 16:08
aizhinuo
Rank: 2
等 级:论坛游民
帖 子:28
专家分:10
注 册:2008-9-5
收藏
得分:0 
/********************************************************************************************************************************************
                                                   汉诺塔问题
                                                

********************************************************************************************************************************************/
#include "stdio.h"
void hannuo(int n,char a,char b,char c)
{    if(n==1)
   printf("%d from %c to %c\n",n,a,c);
    else
    {  hannuo(n-1,a,c,b);
       printf("%d from %c to %c\n",n,a,c);
       hannuo(n-1,b,a,c);
    }
}
void main()
{   int n;
  scanf("%d",&n);
  hannuo(n,'x','y','z');
}
2008-10-23 18:33
快速回复:汉诺塔的程序把我弄迷糊了!高人指点一下!
数据加载中...
 
   



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

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