Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
有一对夫妇买了一头母牛,它从第2年起每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0< n< 55),n的含义如题目中描述。 n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。 每个输出占一行。
Sample Input
2
4
5
0
Sample Output
2
4
6
Hint
Source
HDOJ
递推:
本题求第n年的牛总数,已知第一年为“1”头,进而推出第二年“2”头,第三年“3”头,“4”头,“6”头,“9”头……
所以发现第四年以后,牛的总数就是前一年的牛的总数,加上可以生育的牛的总数,而可生育的牛的总数为三年前牛的总数,因而得到递推方程:a[n] = a[n-1] + a[n-3],(n>2)
递归:
要想求第“n”年的牛的总数,只要知道“n-1”和“n-3”年的牛的总数,再依次向前推
所以递推和递归是一个正向思维一个逆向思维
递推:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
int a[55];
a[0] = 1;
a[1] = 2;
a[2] = 3;
while(scanf("%d",&n)&&n)
{
for(i=3;i<n;i++)
{
a[i] = a[i-1] + a[i-3]; //递推方程;
}
printf("%d\n",a[n-1]);
}
return 0;
}
递归:
#include <stdio.h>
#include <stdlib.h>
int f(int n)
{
if(n<=4)return n;
else return (f(n-1) + f(n-3)); //递归方程;
}
int main()
{
int n;
int sum;
while(scanf("%d",&n)&&n)
{
sum = f(n);
printf("%d\n",sum);
}
return 0;
}