什么是递归?
递归就是函数自己调用自己,就比如
#include<stdio.h>
void cir()
{
printf("hehe\n");//打印hehe
cir();//调用cir这个函数
}
int main()
{
cir();//调用函数
return 0;
}
但是这个写法是错误的,这是个死递归。所以一个完整的递归必须要有两点:
1.判断条件
2.递归层次不能太深,否则会导致栈溢出
3.每次都要接近条件
就拿斐波那契数列来举例:
1 1 2 3 5 8 13 21 34 55... ...
大事化小,将一件事逐渐拆分成不可在分的小事,用n来表示第n个斐波那契数列数,
1, n < 2
n=
(n - 1) + (n - 2) , n > 2
当然,n也不能是负数。所以当n小于0时。值为0。
int Add(int n)
{
if (n > 2)
{
return Add(n - 1) + Add(n - 2);
}
else if (n > 0)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int input = 0;
scanf("%d", &input);
int sum = Add(input);
printf("%d\n", sum);
return 0;
}
这个写法虽然没错,但是当数字增加到50的时候运行速度就开始变慢了。
所以这时候就需要有优化代码了,一般的都是用迭代算法,也就是循环。
递归在特定情况下是挺好用的,比如经典的汉诺塔,青蛙跳台阶这两个事情。
这里我就不做过多赘述了。
接下来再说母牛的故事这个题:
我直接上传代码,其中被注释的是用递归写的,而没有被注释的是用迭代,也就是循环写的。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,
//每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
//(1 ,0 ,0 ,0 ) (1 ,1 ,0 ,0 ) (1 ,1 ,1 ,0 ) (1 ,1 ,1 ,1 ) (2 ,2 ,1 ,1 ) (3 ,3 ,2 ,1 ) (4 ,4 ,3 ,2 )
// 第一年 第二年 第三年 第四年 第五年 第六年 第七年
// 1 2 3 4 6 9 13
// 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
//可生育的母牛的今年的个数等于去年的母牛加上去年生长3年的母牛的个数
//生长1年的母牛的个数等于可生育母牛的个数
//生长两年的母牛的个数等于去年生长一年的母牛的个数
//生长三年的母牛的个数等于去年生长两年的母牛的个数
//extern int a0();
//extern int a1();
//extern int a2();
//extern int a3();
//
//int a3(int n)
//{
// if (n == 2)
// {
// return 0;
// }
// else
// {
// return a2(n - 1);
// }
//}
//
//int a2(int n)
//{
// if (n == 2)
// {
// return 0;
// }
// else
// {
// return a1(n - 1);
// }
//}
//
//int a1(int n)
//{
// if (n == 1)
// {
// return 0;
// }
// else
// {
// return a0(n);
// }
//}
//
//
//int a0(int n)
//{
// if (n == 1)
// {
// return 1;
// }
// else
// {
// return a0(n - 1) + a3(n - 1);
// }
//}
//
//int Cow(int n)
//{
// return a0(n) + a1(n) + a2(n) + a3(n);
//}
int Cow(int n)
{
int a = 1;
int b = 0;
int c = 0;
int d = 0;
int ret = 1;
for (; n > 1;n-- )
{
int sw = 0;
sw = a;
a = a + d;
d = c;
c = b;
b = a;
}
ret = a + b + c + d;
return ret;
/*if (n > 4)
{
return Cow(n - 4) + Cow(n - 3) + Cow(n - 2);
}
else if (n == 4)
{
return 4;
}
else if (n == 3)
{
return 3;
}
else if (n == 2)
{
return 2;
}
else if (n == 1)
{
return 1;
}
else
{
return 0;
}*/
}
int main()
{
int years = 0;
again:
scanf("%d", &years);
do
{
if (years > 0)
{
int sum = Cow(years);
printf("%d\n", sum);
goto again;
}
else
{
break;
}
} while (years);
return 0;
}