一、概念补充
1.1递归
- 定义
当一个函数用它自己的定义时就称为是递归的。
- 基本准则
- 基准情形(base case), 递归中必须有某些基准情形,它们不用递归就能求解
- 不断推进,对于那些需要递归求解的情形,递归调用必须能够朝着产生基准情形的方向推进
- 注意事项
- C允许函数是递归的,但C提供的仅仅是遵循递归思想的一种企图
- 不是所有的数学递归函数都能有效地由C的递归模拟来实现
二、习题求解
【例题1】求
1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 题目分析
由题我们可知以下的信息:
- 求
1+2+..+n
的等差数列的和- 不能使用乘除法,for、while、if、else、switch、case等关键字及条件判断语句
根据这些信息我们可以知道,只能通过简单的加减语句来实现求和。从1写到n显然是不可能的事情,那这时候我们就可以借助递归的思想来实现求和。既然要使用递归,那就要找出递归的基本情形,以及如何不断推进。
- 基准情形:将这个式子化为最简单的形式,即n = 1,这个时候我们需要做任何操作,可以直接返回n的值。满足基准情形的原则,返回值就设定为1,。
- 不断推进:从1到2,两者之间相差了1,推广到一般情形,当n>0时,第n个数总是和第n+1个数相差值为1。
- 源码实现
int sumNums(int n){
//1.设定递归的基准情形
if(n == 1)
{
return 1;
}
//2.返回不断推进的递归条件,直到遇到1时返回
return n + sumNums(n-1);
}
【例题2】计算 SUM(n) = 1 + 2 + 3 + … + n。输入将由一系列整数 n 组成,每行一个整数。对于每种情况,在一行中输出 SUM(n),后跟一个空行。 您可以假设结果将在 32 位有符号整数范围内。
- 题目分析
简单的求等差数列的和,我们可以使用循环体不断加1求和,注意在求解结果的后面打印一个空行。
- 源码实现
#include<stdio.h>
/*定义一个函数,用来求等差数列的和*/
int sumNums(int n)
{
int sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += i;
}
return sum;
}
int main()
{
int n, sum;
//循环输入
while(scanf("%d", &n) != EOF)
{
sum = sumNums(n);
printf("%d\n", sum);
}
return 0;
}