一、函数的递归调用
1>递归的概念 C 语言中的函数可以递归调用,即:可以直接或者间接地自己调用自己。
2>递归思想应该关注的几点:
(1)找到规律 (2)递归调用的条件 (3)结束递归调用的条件
二、递归调用的案例分析
案例一: int f(int x) { int y,z; z = f(y);//在执行 f 函数的过程中又调用 f 函数 return (2 *z); } 我们来分析一下这个函数:
理解清楚递归调用是怎么回事后,我们来思考这样一个问题:真正写程序的时候能不能出 现这样无终止的递归调用。
肯定是不可以出现无终止的递归调用的。那么我们怎么控制递归的终止呢?
我们可以 用 if 语句来控制。也就是说:当某个条件成立时,才继续执行递归调用,否则就不继续。
3>递归解决实际问题:
我们在前面循环课程中编写过求 n!(n 的阶乘)。
用循环的思想写:
#include <stdio.h>
int fac(int m);//函数的声明
int main(void)
{
int n = 0 ,sum = 0;
printf("请输入 n 的值:");
scanf("%d",&n);
第 65 页 共 130 页
sum = fac(n);//函数的调用
printf("%d 的阶乘 = %d\n",n,sum);
return 0;
}
int fac(int m)
{
int i = 0;
int s = 1;
if(m<1)return -1;//形参异常检查
for(i=1;i<=m;i++)
s*=i;
return s;
}
那么现在换一种思考方式:使用递归的思想来解决问题 首先我们都知道 n! = 1 * 2 * 3 * ...* n,求阶乘的过程就是求累乘的过程。那我们也可以反着 来看,n * (n-1)*(n-2)* ... 4*3*2*1。使用函数的递归调用来实现则如下程序:
#include <stdio.h>
int fac(int m);//函数的声明
int main(void)
{
int n = 0 ,sum = 0;
printf("请输入 n 的值:");
scanf("%d",&n);
sum = fac(n);//函数的调用
printf("%d 的阶乘 = %d\n",n,sum);
return 0;
}
int fac(int m)
{
if(m<1)//形参异常检查
return -1;
else if(m==1)//当形参为 1 时返回 1,即结束递归调用的条件
return 1;
else
return m*fac(m-1);
}
为了分析以上的程序运行过程,我们假设从键盘输入 3 给 n,即求 3 的阶乘。3 的阶乘即 3*2*1,则调用 fac函数的过程为:
三、练习:
使用递归调用的形式编写函数实现求:1+2+3+...+n。
#include <stdio.h>
int sum(int m);//函数的声明
int main(void)
{
int n = 0 ,s = 0;
printf("请输入 n 的值:");
scanf("%d",&n);
s = sum(n);//函数的调用
printf("1+2+3+...+%d 的值为%d\n",n,s);
return 0;
}
int sum(int m)
{
if(m<1)//形参异常检查
return -1;
else if(m==1)//当形参为 1 时返回 1,即结束递归调用的条件
return 1;
else
return m+sum(m-1);
}