请问可以详细地解释一下递归的过程么?拜托了

来源:百度知道 编辑:UC知道 时间:2024/06/04 18:13:49
#include<stdio.h>
#define FROM 1
#define MED 2
#define TO 3

void move(int n,int from,int med,int to);

main()
{
int num;

printf("the number of plate is:");
scanf("%d",&num);

move(num,FROM,MED,TO);
system("pause");

}
/*******************************************************************/
/*move函数功能: */
/* 将n个盘子借助于med,从from柱子移动到to柱子。 */
/* 这个过程可以分解成如下3步: */
/* 1、将(n-1)个盘子借助于柱子to,从柱子from移到柱子med; */
/* 2、将第n个盘子直接从柱子from移动到柱子to; */
/* 3、将(n-1)个盘子借助于柱子from,从柱子med移到柱子to; */
/* 参数说明:n:要移动的盘子个数;from:源柱 med:辅助的柱子 to:目标柱 */
/************************************************************************/
void move(int n,int from,int med,int to)
{
if (n==1)
printf("%d-->%d\n",from,to);

没错,这三个参数的值是一直在变。我想很多人在做这道题时不明白的就是那个“借助”,移就移,为什么要借助呢?其实就是要把盘子所在的原柱子跟目标柱子空出来,好让下面一个盘子移到目标柱子。
比如当n=4时:
要把3号盘子先移动到2号柱,好把4号盘移到3号柱。为把3号盘移到2号柱,此时2号盘子它的目标柱子就变成了2号柱了,同理他就要腾出1、2号柱子,因此3号盘借助的是2号柱,2号盘借助的是3号柱。依此类推,它们是不断变化的。

说个 简单 好 理解 的 例子:

求 阶乘!
1!=1
比如:5!=5*4!
这就是 递归
5!=5*4!
=5*4*3!
=5*4*3*2!
=5*4*3*2*1!
=5*4*3*2*1
=120

注意:最后 的 都是 在 调用 函数 本身!

你应该也看到了中间那段注释了吧,递归的思想也就是如此。

如果只有一个盘子,则直接移动就完成了;
对应于 if (n==1) printf("%d-->%d\n",from,to);
而当盘子多于一个时:
1、将(n-1)个盘子借助于柱子to,从柱子from移到柱子med;
这步对应于move(n-1, from, to, med)
2、将第n个盘子直接从柱子from移动到柱子to;
这步对应于printf("%d-->%d\n",from,to)
3、将(n-1)个盘子借助于柱子from,从柱子med移到柱子to
这步对应于move(n-1,med,from,to)

具体的递归过程是很难描述清楚的,你可以用n=3为例,试着手工跟踪这段程序的运行过程,就能理解了

来自:求助得到的回答