我们写程序的时候总有些变量以及对这写变量执行操作的代码,代码都是一个一个函数来组织的。我们可以把这些函数成为功能模块;更专业的说法是成为线程.函数中的变量跟那写对数据执行操作的代码是分别存放在不同的内存块中的:局部变量我们存放在栈,全局变量存放在堆;栈是线成专用的,所以局部变量有局部性,只能在本函数里操作。在调用一个方程的时候;要给传参数,一般的情况是参数被传到栈里,然后参数的下面给方程开辟栈,所以方程能知道参数压在哪里。
好知道是这样以后;我们来写一个程序使用递归来实现N的阶乘;
N!=N*(N-1)*(N-2)....*2*1;
程序如下:
#include <stdio.h>
int func(int n)
{
if(n==0) //N是零了吗?是就返回1.
return 1;
return n*func(n-1); //不是就调用FUNC(N-1)
}
void main()
{
int n=4;
printf("result is %d",func(n));
}
这里面func(n-1)就是在使用递归;
首先第一步在main()里调用func(n)
此时候参数为4;
所以不会执行return 1;
但参数4已经被压在它的栈低下面了(参数压栈后才到线程的栈底哦)
接着执行4*func(3);
但要执行本式子的话;但先算出func(3);
所以有去调用func(3);
参数3又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数4还能保存在;不被破坏.
此时候参数为3;
所以不会执行return 1;
接着执行3*func(2);
但要执行本式子的话;但先算出func(2);
所以有去调用func(2);
参数2又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数3还能保存在;不被破坏.
此时候参数为3;
所以不会执行return 1;
接着执行2*func(1);
但要执行本式子的话;但先算出func(1);
所以有去调用func(1);
参数1又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数2还能保存在;不被破坏.
此时候参数为1;
所以不会执行return 1;
接着执行1*func(0);
但要执行本式子的话;但先算出func(0);
所以有去调用func(0);
这次参数为0;所以返回1;
返回后;程序运行到哪里?
在哪里调用就返回到那里!!!
所以返回到func(1)里面的1*func(0);
在func(1)执行1*1;后返回.
这次返回到哪里?当然是在哪里被调用就返回到哪里!!!
所以返回到func(2)里的2*func(1);算出结果2*1*1.
所以返回2*1*1;
这次返回到哪里?当然是在哪里被调用就返回到哪里!!!
所以返回到func(3)里的3*func(2);算出结果3*2*1*1.
所以返回3*2*1*1;
这次返回到哪里?当然是在哪里被调用就返回到哪里!!!
所以返回到func(4)里的4*func(3);算出结果4*3*2*1*1.
所以返回4*3*2*1*1;
这次返回到哪里?当然是在哪里被调用就返回到哪里!!!
所以返回到main()里的printf(....)!!!
在本程序中就是先把所有东西列出来;在往回计算.
呵呵 ,就是这样.
|