【华为练习题 】 长寿的兔子

来源:互联网 发布:数据录入员招聘58同城 编辑:程序博客网 时间:2024/04/26 14:42

【华为练习题 】 长寿的兔子

题目

从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第n个月出生多少对小兔子

简单示例:

比如输入1,第一个月出生的兔子只有一对,所以输出为1
比如输入2,第二个月出生的兔子只有一对,所以输出为1
比如输出为3,则该月份有两对兔子出生,则输出为2

要求:

实现以下接口:
输入一个正整数,表示第几个月,输出该月份生产出的小兔子的对数
调用者会保证:
输入的月份与生产的兔子数目都为unsigned int 能表达的数字

分析

非递归:将兔子分为大中小3类(大兔子:可以产小兔子,中兔子:成长1个月的小兔子,下个月会变成大兔子),每个月的大兔子数量为上个月的大兔子数量加上中兔子数量,中兔子数量为上个月小兔子数量,小兔子数量为上个月大兔子数量。
递归:某月出生的兔子数量等于大兔子数量,大兔子数量等于上个月的大兔子数量加上中兔子数量,而上个月的中兔子数量等于上上个月的小兔子数量,等于上上上个月的大兔子数量,于是得到递推式:
f(n) = f(n-1) + f(n-3) (n>=3)

解答

非递归方式

#include <iostream>using namespace std;unsigned rabbit(unsigned n){    unsigned  big = 1, mid = 0, little = 0;    while (n--)    {        unsigned tmp1 = big, tmp2 = mid, tmp3 = little;        big = tmp1 + tmp2;        mid = tmp3;        little = tmp1;    }    return big;}int main(){    unsigned n;    cin >> n;    cout << rabbit(n) << endl;    return 0;}

递归方式

#include <iostream>using namespace std;unsigned rabbit(unsigned n){    if (n <= 2) return 1;    return rabbit(n-1) + rabbit(n-3);}int main(){    unsigned n;    cin >> n;    cout << rabbit(n) << endl;    return 0;}
1 0