递归:递延 和 回归
两个必要的条件:
1.存在限制条件
2.每次递归后越来越接近这个限制条件
青蛙跳台:每次可以跳一个台阶或者是两个台阶
想法在开始时可以选择跳1步或者两步,当台阶数x小于2时,输出为x,其他情况为f(x-1)+f(x-2);
代码:
#include<stdio.h>
int f(int x)
{
if(x<=2)
return x;
return f(x-1)+f(x-2);
}
int main()
{
int n=0;
scanf("%d",&n);
int s=0;
s=f(n);
printf("%d",s);
return 0;
}
编写函数求字符串长度不允许创建零时变量
1.创建了临时变量
#include<stdio.h>
int my_strlen(char* str)
{
int count=0;
while(*str!='\0')//字符串a b c \0
{
count++;
str++;
}
return count;
}
int main()
{
char arr[]="abc";
int len=my_strlen(arr);
printf("%d",len);
return 0;
}
可以采用递归的方式
#include<stdio.h>
int my_strlen(char* str)
{
if(*str!='\0')
return 1+my_strlen(str+1);//不能是str++如果是str++会先传str在加加一直不变
else
return 0;
}
int main()
{
char arr[]="abc";
int len=my_strlen(arr);
printf("%d",len);
return 0;
}
n的阶乘
想法:原数字乘以前面的数字n*f(n-1),截至条件时n<=2时为2
#include<stdio.h>
int fac(int n)
{
if(n<=2)
return n;
else
return n*fac(n-1);
}
int main()
{
int x;
scanf("%d",&x);
int s=fac(x);
printf("%d",s);
return 0;
}
求第n个费波纳列数
想法:截至条件n<=2时返回还是1,费波纳列数时前面一项加上前面的前面的一项所以为f(n-1)+f(n-2)
#include<stdio.h>
int f(int n)
{
if(n<=2)
return 1;
else
return f(n-2)+f(n-1);
}
int main()
{
int n=0;
scanf("%d",&n);
int s=f(n);
printf("%d",s);
return 0;
}
可以这样想,递归每个步骤的规律都相同。第一个人和第n个人的步骤都相同,而上面的第一个第二个正好不满足此步骤,因而可以为截至条件。