递归
递归的两个条件:
1、调用自己本身
2、有一个趋于终止的条件
但是需要注意,递归的调用是在栈上执行(需要注意溢出的问题)
斐波那契数
指的是这样一个数列:1、1、2、3、5、8、13、21、……,斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。
非递归的方法:
#include<stdio.h>
//斐波那契数,非递归
int Fib(int n)
{
int f1 = 1;
int f2 = 1;
int f3 = 1; //保证第一个数是1
int i = 0;
for(i = 3;i <= n;i++)
{
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f3;
}
int main()
{
int input = 0;
scanf_s("%d", &input);
printf("第%d个斐波那契数是%d\n",input,Fib(input));
}
递归实现
#include<stdio.h>
//斐波那契数,递归方式
int Fib(int num)
{
if (num <= 2)
{
return 1;
}
else
{
int sum = Fib(num - 1) + Fib(num - 2);
return sum;
}
}
int main()
{
int input = 0;
scanf_s("%d", &input);
printf("第%d个斐波那契数是%d\n", input, Fib(input));
}
求斐波那契数虽然可以用递归来实现,但其实一般不用递归,递归的计算量太大,时间太长,且很容易造成栈的溢出;所以一般用循环的方式实现
Strlen的实现
strlen是用来求字符串长度的,来实现一下strlen的内部代码
非递归:
#include<stdio.h>
//求字符串长度strlen,非递归
int instrlen(char* string)
{
int count = 0;
while (*string != '\0')
{
count++;
*string++;
}
return count;
}
int main()
{
char* string = "HelloWorld";
printf("%d\n", instrlen(string));
}
递归的方法:
#include<stdio.h>
//求字符串长度strlen,递归
int instrlen(char* string)
{
if (*string == '\0')
{
return 0;
}
else
{
return 1 + instrlen(string + 1);
}
}
int main()
{
char* string = "HelloWorld";
printf("%d\n", instrlen(string));
}
青蛙跳台阶问题
问题:一只青蛙一次可以跳上一级台阶,一次也可以跳上两级台阶,问跳上n级台阶有几种跳法?
分析:只有一级台阶,有一种跳法;有两级台阶,有两种跳法;有三级台阶,有三种跳法;有四级台阶,有5种跳法…
得到从两级台阶之后,n级台阶的跳法=(n-1)级台阶的跳法+(n-2)级台阶的跳法
便可以使用递归的思想来实现
#include<stdio.h>
int JumpFloor(int input)
{
if(n==1)
{
return 1;
}else if(n==2)
{
return 2;
}
return JumpFloor(n-1)+JumpFloor(n-2);
}
int main()
{
printf("%d\n",Jumpfloor(3));
}