c语言递归 累和 ,累乘积,斐波那契数列,字符串长度
目录
递归使用场景
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));
}