c语言函数递归调用问题(请高手帮忙详细解释)

Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小... Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图8.13)。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。
资料上给出的程序如下:分析:(将n个盘子从A座移到C座可以分解为以下3个步骤:
(1) 将A上n-1个盘借助C座先移到B座上。
(2) 把A座上剩下的一个盘移到C座上。
(3) 将n-1个盘从B座借助于A座移到C座上。

程序:
#include <stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);
/* 对hanoi函数的声明 */
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)
/* 定义hanoi函数,将n个盘从one座借助two座,移到three座 */
{
void move(char x,char y); /* 对move函数的声明 */
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) /* 定义move函数 */
{
printf(“%c-->%c\n",x,y);
}
运行情况如下:
input the number of diskes:3↙
The steps to noving 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
我想问的是,在这几句中:
void move(char x,char y); /* 对move函数的声明 */
if(n==1) move(one,three);
else
{ hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three); }
}
到底是怎么调用的,形实参的传递是如何执行的。特别是两个hanoi函数的形实参值的传递,我被这程序搞糊涂了,我怎么也想不通这个程序会达到题目中所要求的那样,请高手们帮帮我的忙,详细解释、分析一下程序的执行,请务必详细!!!!当然,若能说一下程序的构思就更好了!!!!!!
汉诺塔问题,请高手帮忙,解释清楚!!!本人很无奈!!!c语言中最不清楚的就是汉诺塔问题!!!!!!!但一直没得到解决!
展开
 我来答
Tidus_forever
2012-03-09 · TA获得超过4398个赞
知道大有可为答主
回答量:2782
采纳率:100%
帮助的人:1819万
展开全部
确实,初学C的时候,汉诺塔的递归看起来确实是比较神奇的程序。
其中主要就在hanoi 这个递归函数,传的参数里面有一个n 代表是几层递归。
如果n=1 代表只有一个,move(one,three); 就是把第一个移到第三个就行了。否则
第一个柱子上有n个(n>1) 要移到第三个。需要把上面的n-1个移到第二个,最下面的一个移到第三个,再把第二个柱子上的n-1个移到第三个。 要这三个步骤。

其中,第一个,和第三个步骤,和本身其实是一样的。
就是把n-1个移到第二个,注意hanoi的参数
/* 定义hanoi函数,将n个盘从one座借助two座,移到three座 */
two 即第二个参数,这是表示用来借助的

就假设n=2 吧 hanoi(2,'A','B','C'); 变成了
hanoi(1,A,C,B); //这个代表A座上有一块,需要借助C座,移到B座
A--->C
hanoi(1,B,A,C); //这个代表B座上有一块,需要借助A座,移到C座
最后会输出
A-->B
A-->C
B-->C

假设n=3 hanoi(3,'A','B','C');
hanoi(2,A,C,B); //这个代表A座上有两块,需要借助C座,移到B座
A--->C
hanoi(2,B,A,C); //这个代表B座上有两块,需要借助A座,移到C座

A座上有两块,需要借助C座,移到B座 会输出
A-->C
A-->B
C-->B

B座上有两块,需要借助A座,移到C座 会输出
B-->A
B-->C
A-->C
SEO_bcc
2012-03-09 · TA获得超过190个赞
知道答主
回答量:44
采纳率:0%
帮助的人:19.7万
展开全部

看到这么多疑问我敢肯定一点,你并没有真正意识到什么叫递归程序?这个程序不是一个很简单的程序,如果搞不清递归的详细定义,即使你明白了这个程序,也是勉强,如果想彻底了解到递归,必须了解它的定义,思路清晰后再看这道题就很简单了,相信你自己也可以独自解析这个程序。我下面有一个图还是比较简单明了的介绍递归的,可以参考下。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
谁让我揩油
2012-03-09 · TA获得超过1293个赞
知道小有建树答主
回答量:326
采纳率:0%
帮助的人:192万
展开全部
如果只有一个盘,直接把它从one移到three位置;若有n个盘,就假设有n-1个可以知道怎么移,那么把上边n-1个盘从one移到two位置,再把最底第n个盘从one移到three位置,最后把其余n-1个从two移到three位置。问题就解决了。

对于n-1可以依靠n-2解决,以此类推,直到2个盘时可以依靠1个盘的解决方法,到1个盘时,已经给出了解决方法。这就是递归的思想,类似于数学的归纳法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
纤宗颜q
2012-03-09
知道答主
回答量:8
采纳率:0%
帮助的人:1.3万
展开全部
buhui
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sunhuaiya101
2012-03-11
知道答主
回答量:36
采纳率:0%
帮助的人:13.2万
展开全部
pp
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式