我给你简单写了一个经典的递归函数(求阶乘)
#include
int fun(int n)
{
printf("test...\n");//先帮助你理解递归的基本过程
if(n==0)
return 1;
else
return n*fun(n-1);
}
void main()
{
int n;
printf("输入一个整数: ");
scanf("%d",&n);
printf("result=%d\n",fun(n));
}
当一个问题具有如下特征时,可用递归求解:
1.大问题能分解成若干个子问题;
2.子问题或者是一个定值或者是与大问题具有相同性质的问题;
3.子问题在最小尺度上有直接解,即过程能朝着问题结束的方向发展(递归结束条件);
首先,递归是通过栈实现的,若没有遇到结束条件,入栈保存本次调用的返回地址,局部变量,形式参数等值。
比如计算上面的fun(3)过程:
执行时遇到fun(2),保存当前的n(n=3)以及fun(2)执行完后的返回地址;然后继续执行,继续对局部变量和函数返回地址入栈保存。直到遇到递归结束条件,开始弹栈,这是将栈顶n域值恢复给n,栈顶地址域作为返回地址出栈,继续这样下去,直到栈空,最终所得的n就是所要求得值。
不知道这样的描述你能不能懂。总之,利用栈的先进先出特性,先往下递推,遇到结束条件后回溯(弹栈求结果,最后返回),对于地址的相关问题,如果你学汇编语言就会懂了。。。
你可以画栈的图理解求阶乘的过程,对递归的理解绝对有帮助。希望对你有用。。。
标签:递归函数,执行