目录
递归使用场景
1:使用递归的方式计算 Sn=1+2+3+..+100
2:计算 n!=n*(n-1)*(n-2)*......*1;
3:计算输出斐波那契数列前20项,并按每行4个数的格式输出(2019年)
4: 用递归和非递归两种方式编写函数strlength()。该函数与库函数strlen()功能相同。返回参数字符串的长度(整形),不允许调用任何库函数.(2015年)
递归使用场景
问题有规律可循:通向公式
具有递归的结束条件:明确的值
递归框架:if配合
结束条件成立,返回已知值(结束递归)
结束条件不成立,进行递归
1:使用递归的方式计算 Sn=1+2+3+..+100
通向 公式 如果 n=1 返回1
否则返回 n+f(n-1)
#include<stdio.h>
int add(int n)
{
if (n== 1) return 1;
else return n + add(n - 1);
}
void main()
{
printf("%d", add(100));
}
2:计算 n!=n*(n-1)*(n-2)*......*1;
找通向公式 当n=0或者1 的时候为终止条件返回1
否则 n*(n-1)!
#include<stdio.h>
int fac(int n)
{
if (n == 1) return 1;
else return n*fac(n-1);
}
void main()
{
printf("%d", fac(3));
}
3:计算输出斐波那契数列前20项,并按每行4个数的格式输出(2019年)
找通向公式 n=1 的时候返回1 n =2的时候返回1
否则就返回 前两项之和 f(n-1)+f(n-2)
#include<stdio.h>
int fib(int n)
{
if (n == 1|| n==2) return 1;
else return fib(n - 1) + fib(n - 2);
}
void main()
{
int i;
for (i = 1; i <= 20; i++) {
printf("%8d", fib(i));
if (i % 4 == 0) printf("\n");
}
4: 用递归和非递归两种方式编写函数strlength()。该函数与库函数strlen()功能相同。返回参数字符串的长度(整形),不允许调用任何库函数.(2015年)
字符串长度不包括\0
把字符串一点一点弄短 大事化小事
//不适用递归
int strlength(char *s)
{
int n = 0;
while (*s++) n++;
return n;
}
#include<stdio.h>
//递归方式(大事化小)
int strlength(char *s)
{
if (*s=='\0') return 0;
else return 1 + strlength(s+1);//往后挪一个(这里是地址加1)
}
void main()
{
char s[100];
gets(s);
printf("%d", strlength(s));
}