【华为练习题 】 长寿的兔子
题目
从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第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;
}
时间: 2024-10-14 01:27:10