注意递归的必要条件
1.递归必须有停下来的条件。
2.每次递归调用之后越来越接近这个限制的条件。
例题 :例如输入1234,输出1 2 3 4
递归实现:
#incude<stdio.h>
void print(unsigned int sum)
{
if (sum > 9) { //不在满足条件后不在递归
print(sum / 10);
}
printf("%d",sum%10);
}
int main()
{
unsigned int sum;
scanf("%u", &sum);
print(sum);
}
流程图:
题目解析:
print在调用时,在不断接近限制条件。
print(1 2 3 4)
print(1 2 3) 4
print(1 2 ) 3 4
print(1) 2 3 4
1 2 3 4
例题2:求字符串的长度
模拟实现strlen
题目要求:编写函数不允许创建临时变量,求字符串的成都
#include<stdio.h>
int my_strlen(char* arr)
{
if (*arr != '\0') {
return 1+my_strlen(arr+1);
}
else {
return 0;
}
}
int main()
{
char arr[] = { "abc" };//a b c \0
int len = my_strlen(arr);
printf("%d", len);
}
流程图:
题目分析:
在函数里时: my_strlen(abc)
1+my_strlen(bc)
1+1my_strlen(c)
1+1+1+my_strlen()
1+1+1+0
例题3:n的阶乘
例如:5!=5*4*3*2*1=120
#inlcude<stdio.h>
int fuc(int n)
{
if (n > 1) {
return n * fuc(n - 1);//5*(4!)
}
else {
return 1;
}
}
int main()
{
int n;
scanf("%d", &n);
int ret = fuc(n);
printf("%d", ret);
}
公式:
利用迭代的方式 :
#include<stdio.h>
int fuc(int n)
{
int ret=1;
for (int i = n; i>=1; i--) {
ret *= i;
}
return ret;
}
int main()
{
int n;
scanf("%d", &n);
int ret = fuc(n);
printf("%d", ret);
}
注意:如果递归实现不了或者比较麻烦时可以使用迭代方式
例题4:求第n个斐波那契数列(不考虑溢出)
斐波那契数列的形式为:1 1 2 3 5 8 13 21 34 55 ....
#include<stdio.h>
int Fib(int n)
{
if (n >2) {
return Fib(n - 1) + Fib(n - 2);
}
else {
return 1;
}
}
int main()
{
int n;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
}
公式:
程序改进:
#include<stdio.h>
int Fib(n)
{
int a = 1, b = 1, c = 0;
if (n <=2)return 1;
for (int i = 0; i < n; i++) {
a = b;
b = c;
c = a + b;
}
return c;
}
int main()
{
int n;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
}
题目分析:
例如:在Fib函数中求第五个斐波那契额数列
1.a=1b=1c=a+b=2第三个数列
2.a=b=1,b=c=2,c=a+b=3第四个数列
3.a=b=2,b=c=3,c=a+b=5第五个数列