uacs2024

导航

C语言网题目 1004: [递归]母牛的故事

题目描述

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入格式

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
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;
    }
}

 

 

 
 

posted on 2024-11-11 16:19  ᶜʸᵃⁿ  阅读(7)  评论(0编辑  收藏  举报