码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-22 16:19:48      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

题目

从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第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;
}

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

标签:

原文地址:http://blog.csdn.net/sps900608/article/details/52276992

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!