递归程序的执行过程

我们首先从一个简单的递归程序开始分析递归程序的执行过程。
  例9-27:用递归函数求n!。
#include <stdio.h>
main ( )
{ int n, p;
printf ("N=?"); scanf ("%d",&n);
p = facto (n);
printf ("%d!=%d\n", n, p);
}
facto ( int n )
{ int r;
if (n==0) r=1;
else r=n*facto(n-1);
return (r);
}
在程序中,使用facto函数求n的阶乘,在facto函数中使用了"r=n*facto(n-1)"的语句形式,该语句中调用了facto函数,这是一种自己调用,是典型的直接递归调用,facto是递归函数。
在函数的递归调用过程中,并不是重新复制该函数,只是重新使用新的变量和参数。每次递归调用都要保存旧的参数和变量,使用新的参数和变量,每次递归调用返回时,再恢复旧的参数和变量,并从函数中上次递归调用的地方继续执行。
下面我们以求4!为例,分析递归函数的执行过程。


  在主函数中输入n=4,执行语句"p=facto(n);",以facto(4)进入函数facto中。
第一次进入facto函数时,n=4,由于不满足条件"(n==0)",所以执行else子句下面的"r=n*facto(n-1)",此时为"r=4*facto(3)"。这里需要以facto(3)第二次调用facto函数,从而开始了第二次调用该函数的过程。
第二次进入facto时,仍不满足条件"(n==0)",所以执行"r=3*facto(2)"。
第三次进入facto函数。第三次时n=2,仍然执行"r=2*facto(1)"。
第四次调用facto函数,第四次时,n=1仍不满足"(n==0)"的条件。
第五次调用facto函数,此时"n=0",满足"n==0",执行"r=1",再执行"return(r)"操作,以返回值"1"退出第五次调用过程,返回到第四次调用过程中。


  在第四次调用过程中以第五调用返回的值带入"r=2*facto(1)"中,计算出r=2*1=2,执行return(r)语句,以返回值"2"退出第四次调用过程,返回到第三次调用过程中。
  这样程序逐步返回,不断用返回值乘以n的当前值,并将结果作为本次调用的返回值返回到上次调用。最后返回到第一次调用,计算出facto(4)的返回值为24。
以上函数facto的递归调用过程,在图9-7中直观给出函数的执行过程。
从上述递归函数的执行过程中可以看到:作为函数形参的变量n和函数内部使用的局部变量r,在每次调用时,它的值都不相同,随着调用的深入,n和r的值也随之变化。随着调用的返回,n和r的值又层层恢复。
在编写递归函数时,必须使用if语句建立递归的结束条件,使程序能够在满足一定条件时结束递归,逐层返回。如果没有这样的if语句,在调用该函数进入递归过程后,就会无休止地执行下去而不会返回,这是编写递归程序时经常发生的错误。在例题中,if(n==0)就是递归的结束条件。


  例9-28:采用递归方法计算x的n次方。
#include <stdio.h>
main( )
{ int x, n;
printf (" x=? n=? "); 
scanf ("%d%d", &x, &n);
printf("%d**%d=%d\n", x, n, power(x,n) );
}
power ( int x, int n )
{ if ( n==0 ) return (1);
else return (x * power (x, n-1));
}
  在power函数中,"if ( n==0 )"是递归的结束条件。函数中使用了两个return语句分别返回不同的计算结果。

<!--EndFragment-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值