本文主要是介绍【华为练习题 】 长寿的兔子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【华为练习题 】 长寿的兔子
题目
从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第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;
}
这篇关于【华为练习题 】 长寿的兔子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!