C语言网题目 1004: [递归]母牛的故事
题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2 4 5 0
样例输出
2 4 6
这道题的关键之处是要找出关系 : year[n] = year[n-3] + year[n-1] ; 即三年前的牛在今年能生出新的小牛,再加上原本就有的牛,就是今年的牛的数量.
递归法
#include <iostream>
using namespace std;
int count(int n){
if(n <= 4) return n;//前4年牛的数量是与年份相等的
return count(n-3)+count(n-1);
}
int main(){
int n;cin >> n;
while(n != 0){
cout << count(n) << endl;
cin >> n;
}
}
当 n 比较大时,递归层数就很深,输入的 n 比较多时,就会产生大量的重复运算,所以可以使用数组存储已计算的数据
递推法
#include <iostream>
using namespace std;
#include <vector>
vector<int> year;
void count(int n,int &max){
if(max >= n) {
cout << year[n] << endl;
return;
}
while(max < n){
year.push_back(year[max-2] + year[max]);
max++;
}
cout << year[n] << endl;
}
int main(){
int n,max;
max = 4;//max表示当前最多算到第max年的数据
year.push_back(-1);//无特别意义,只是为了让year[n]表示第n年的数量
for(int i = 1;i <= 4;i++) year.push_back(i);
cin >> n;
while(n != 0){
count(n,max);
cin >> n;
}
}