Day07 2023/03/06
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
输入描述
输入一个int型整数表示第n个月。
输出描述:
输出对应的兔子总数
1、思路
来自大佬 蓝蓝计算机考研算法-day07统计每个月兔子总数 - 掘金 (juejin.cn)
思路1-c++
递归:本质是斐波那契数列:处前两个月外,当月的兔子数为前两个月兔子数之和。
思路2-c++
迭代:三个月以上的设为k3,两个月的设为k2,一个月的设为k1;
每过一个月,k3 += k2; k2 = k1; k1 = k3;
2、具体实现
思路1-C++
#include <iostream>
using namespace std;
int rabitSum1(int month)
{
if (month == 1 || month == 2)
return 1;
else
return rabitSum1(month - 1) + rabitSum1(month - 2); // 兔子数等于前两个月兔子数之和
}
- 时间复杂度 O(2^n) --- 遍历整个二叉树结点
- 时间复杂度 O(n) --- 递归栈的深度为n
思路2-c++
int rabitSum2(int month)
{
int k1 = 1, k2 = 0, k3 = 0; // 初始化第一个月的数据
for (size_t i = 2; i <= month; i++)
{
k3 += k2;
k2 = k1;
k1 = k3;
}
return k1 + k2 + k3;
}
- 时间复杂度 O(n) --- 循环n-1次,n为月份数
- 空间复杂度 O(1) ---常数级空间
结果