递归算法的思想

文章介绍了函数的递归调用概念,强调了找到规律、递归调用条件和结束递归的条件是递归思想的关键。通过计算阶乘的例子展示了如何用递归解决实际问题,以及如何控制递归的终止,防止无限递归的发生。最后,提供了一个使用递归调用求和的练习。
摘要由CSDN通过智能技术生成

一、函数的递归调用

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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值