杭州市人才市场招聘:C语言智囊团

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/09 18:05:30
我感觉C语言中函数的递归调用太难理解了,尤其像那个汉诺塔问题的求解,函数的调用过程几乎无法理解了,不知道它是从什么地方到什么地方运行的。
我想不出有什么好的方法去探知,甚至于是一个谜。期待高人指路献策,小生不胜感激!

附带此题如下所表示:
#include<stdio.h>
movedisk(n,A,C,B)
{
if(n>1){
movedisk(n-1,A,B,C);
printf("Move disk %d from post %c to post %c.\n",n,A,C);
movedisk(n-1,B,C,A);
}
else
printf("Move disk 1 from post %c to post %c.\n",A,C);
}
main()
{
int n;
char A='A',B='B',C='C';
printf("Please input a digit of disk first:\n");
scanf("%d",&n);
movedisk(n,A,C,B);
}

(其中A,B,C表示3根柱子,并自左向右排列。
需要把A中的盘子转移到C中。)

可以这样来理解递归:
1. 递归包含很多相同的步骤(或解决方法、途径);
2. 相邻的递归步骤可以通过一个简单的操作来表示差异。

像汉诺塔的问题,就是将A的n个东西通过B挪到C
A -> B -> C
中间用到的步骤是这样的,先将A上的n-1个东西通过C挪到B,然后将A上的1个东西直接挪到C,然后再通过A将B上的n-1个东西挪到C。

看出门道了吗?
开始第一步后,后面的步骤其实是一摸一样的,直到挪完为止。
这就是递归,你只需要知道第一步是如何做的就可以了,以后的就是一样的步骤了。

的确,这是很难理解的东西,递归就是一种数学方法,它是用来解决问题的,当然汉诺塔也是一类用递归方法解决了的问题,我以前也看不懂,因为缺少一些知识,有关于栈在底层的机制,还有就是自己不明白怎么解题的,这样脑中没有方法,自然很难理解,你可以考虑问题要如何解决,然后考虑它是否可以用递归,如果可以用递归应该怎么做,这样的话你应该就能好理解一些了!

递归说白了就是自己调用自己~