分类: C/C++
2009-09-25 10:29:54
/*http://blog.chinaunix.net/u3/104083/*/
/*递归例子*/
#include
void jcakarm(int);
int main(void)
{
jcakarm(1);
getchar();
return 0;
}
void jcakarm(int n)
{
printf("jackarm A n = %02d,n location %p\n",n,&n); /* printf #1 */
if(n<4) jcakarm(n+1); //n = 4
printf("jackarm B n = %02d,n location %p\n",n,&n); /* printf #2 */
}
运行的结果:
首先, main() 使用参数 1 调用了函数 jcakarm() ,于是 jcakarm() 中形式参数 n 的值是 1, 故打印语句 printf #1 输出了 jackarm A n = 01 。
然后,由于 n 的数值小于 4 ,所以 jcakarm() (第 1 级)使用参数 n+1 即数值 2 调用了 jcakarm()( 第 2 级 ). 使得 n 在第 2 级调用中被赋值 2, 打印句 #1 输出的是 jackarm A n = 02 。与之类似,下面的两次调用分别打印出 jackarm A n = 03 和 jackarm A n = 04 。
当进行四级调用的时候,jackarm()中的形参n的值是4,所以执行完printf("jackarm A n = %02d,n location %p\n",n,&n); /* printf #1 */这一句后,没有执行if(n<4) jcakarm(n+1); //n = 4 中的jackarm(n+1),而是顺序执行了printf("jackarm B n = %02d,n location %p\n",n,&n); /* printf #2 */ 这句,就遇上"}"号,也就是返回(四级调用的返回),当然是三级调用了,顺序打印了printf("jackarm B n = %02d,n location %p\n",n,&n); /* printf #2 */依次类推,打印了后面四行.当一级调用的时候才返回mian()函数,执行getchar()函数!
递归的基本原理:
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句 #peintf #1 位于递归调用语句前,它按照递 归调用的顺序被执行了 4 次.
3 每一级的函数调用都有自己的私有变量.
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.