标题:Hanoi塔问题
只看楼主
撒哈拉沙漠
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-8-10
 问题点数:0 回复次数:9 
Hanoi塔问题

Hanoi塔问题

大家给我讲讲红色那段程序的运行吧,有点不明白啊。就按照4的情况来说吧。。。。。
编译运行结果如下:
Input a number:
4


The step to moving 4 diskes:


a-->b


a-->c


b-->c


a-->b


……

#include <stdio.h>
#include <conio.h>
int 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);
}
}

int main(void)
{
int h;
printf("\nInput a number:\n");
scanf("%d",&h);
printf("The step to moving %2d diskes:\n",h);
move(h,'a','b','c');
getch();
return 0;
}

搜索更多相关主题的帖子: Hanoi 
2007-09-28 13:22
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
得分:0 
move(n-1,x,z,y);/*将n-1个盘子从x借助z移动到y上*/
printf("%c-->%c\n",x,z);/*将一个盘子从x移动到z上*/
move(n-1,y,x,z); /*将n-1个盘子从y借助x移动到z上*/

这里你借助例子或许能比较容易懂,如:n=3时,移动步骤是怎么样的,对照步骤再去理解上面的语句.

2007-09-28 13:54
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 
move(n-1,x,z,y); // 把x上面n-1个disk-->y
printf("%c-->%c\n",x,z); // 把剩下的最后一个disk从x-->z
move(n-1,y,x,z); // 把y上的n-1个disk -->z

C++学习
2007-09-28 13:55
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
得分:0 

这样看是不是好理解些:
[CODE]#include <stdio.h>
#include <conio.h>

void moveone(int a,int b)
{
printf("%c-->%c\n",a,b);
}

void move(int n,int x,int y,int z)
{
if(n==1)
moveone(x,z);
else
{
move(n-1,x,z,y);
moveone(x,z);
move(n-1,y,x,z);
}
}
int main(void)
{
int h;
printf("\nInput a number:\n");
scanf("%d",&h);
printf("The step to moving %2d diskes:\n",h);
move(h,'a','b','c');
getch();
return 0;
}[/CODE]


C++学习
2007-09-28 14:04
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
思想就是把A的n-1个移动到B上(借助C),然后直接把最后一个移动到C处,再把B上的(n-1个)东西移动到C上(借助A)(这个就是递归过程).

倚天照海花无数,流水高山心自知。
2007-09-28 14:20
撒哈拉沙漠
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-8-10
得分:0 
回复:(撒哈拉沙漠)Hanoi塔问题

整体的思想我已经理解了~~~
但是这个程序的具体的步骤不是很清晰~~~~

#include <stdio.h>
#include <conio.h>
int 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);
}
}

int main(void)
{
int h;
printf("\nInput a number:\n");
scanf("%d",&h);
printf("The step to moving %2d diskes:\n",h);
move(h,'a','b','c');
getch();
return 0;
}

分析被调函数的运行步骤如下:
输入一个数4,即n=4,x='a',y='b',z='c'
运行到第一个move(n-1,x,z,y),变成move(3,'a','c','b') 这时是往下执行Printf语句还是返回被调函数重新开始判断n的值?如果往下执行是输出a-->b吗?还是返回被调函数重新开始判断n值,直到n==1时输出a-->b?但是还像两种都不好理解,无法得到和编译显示的一样的结果吧?另外,每返回一次,下面两个move中的y,z(前一个move)和y,x(后一个move)是不是互换的?

谢谢大家,本人有点笨~~呵呵

2007-09-28 15:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
那你就应该看看递归机制是怎么回事.

举个简单的
int MUl(int n)
{
if(n)
MUl(n-1);
printf("%d\n",n);
}

每次做完MUL(n-1)后来还要执行的打印的.一层一层调用再结束.

倚天照海花无数,流水高山心自知。
2007-09-28 16:03
撒哈拉沙漠
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-8-10
得分:0 

有点明白了~~~~

也就是说在第一个MOVE被执行后,接下来还要执行printf()语句啊,但是这样的话,第一个输出结果怎么会是a-->b呢?
不应该是a-->c吗?

看来我还是再好好想想。。

2007-09-28 18:47
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

这个例子一定是先输出递归出口的语句.


倚天照海花无数,流水高山心自知。
2007-09-28 21:39
njaulj
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-11-21
得分:0 
远去的列车的解释是最好的,本人拙见
2007-12-02 09:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-173610-1-1.html




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

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