题目:
假设农场种成熟的母牛每年只会生一头小母牛,并且永远不会死。第一年农场有一头成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后成熟又可以生小母牛。给定整数N,求出N年后牛的数量。
分析:
首先第N-1年的牛都会活到第N年
所有成熟的牛都会生一头小牛,如何统计成熟的牛的数量?
成熟的牛数量 = 第 N-3 年所有的牛 C(N-3)
第N-1年到N年出生的牛数量 = 出生小牛的数量就是到第N年成熟母牛的数量,也就是C(N-3)
所有牛数量:C(N) = C(N-1) + C(N-3) C(1)=1 C(2)=2 C(3)=3
代码实现:
方法一:(暴力递归)
public static int c1(int N) {
if (N < 1) {
return 0;
}
if (N == 1 || N == 2 || N == 3) {
return N;
}
return c1(N-1) + c1(N-3);
}
方法二:O(N)
public static int c2(int N) {
if (N < 1) {
return 0;
}
if (N == 1 || N == 2 || N == 3) {
return N;
}
int res = 3;
int pre = 2;
int pre2 = 1;
int tmp = 0;
int tmp2= 0;
for (int i = 4; i <= N; i++) {
tmp = res;
tmp2 = pre;
res += pre2;
pre = tmp;
pre2 = tmp2;
}
return res;
}
方法三:
C(N) = C(N-1) + C(N-3) 是三阶递推数列。
矩阵阶乘方法 matrixPower() 参考博客:斐波那契数列问题
public static int c3(int N) {
if (N < 1) {
return 0;
}
if (N == 1 || N == 2 || N == 3) {
return N;
}
int[][] base = {{1,1,0},{0,0,1},{1,0,0}};
int[][] res = matrixPower(base, N-3);
return 3*res[0][0] + 2*res[1][0] + res[2][0];
}