题目
母牛每年生一头母牛, 新出生的母牛成长三年后也能每年生一头母牛, 假设牛不会死. 求 N
年后母牛的数量
题解
递归
归纳得 F(N) = F(N-1) + F(N-3)
该式实际上可解释为每年牛的总数等于前一年牛的总数 F(N-1)
加上三年前牛的总数 F(N-3)
, 其中 F(N-3)
即为每年新增的牛的数量.
若规定牛的寿命为 10 年, 减去 F(N-10)
即可
Java
1 2 3 4 5 6 7 8 9 10
| public class CowNumber { public static int getCowNum(int N) { if (N <= 2) return N + 1; return getCowNum(N - 1) + getCowNum(N - 3); }
public static void main(String[] args) { System.out.println(getCowNum(8)); } }
|
Python
1 2 3 4 5
| def get_cow_number(n): if n <= 2: return n + 1
return get_cow_number(n - 1) + get_cow_number(n - 3)
|
Go
1 2 3 4 5 6 7
| func getCowNum(n int) int { if n <= 2 { return n + 1 }
return getCowNum(n-1) + getCowNum(n-3) }
|
斐波那契数列的矩阵求法
以上算法的时间复杂度为 O(N²)
本题可参考斐波那契数列的矩阵求法, 该算法时间复杂度仅为 O(logN)
推导如下:
1 2 3
| F(n) = a*F(n-1) + b*F(n-2) + c*F(n-3) F(n-1) = F(n-1) F(n-2) = F(n-2)
|
本题中 a = 1, b = 0, c = 1
故可得
Python
1 2 3 4 5 6 7 8 9 10 11
| import numpy as np
def fib_matrix(n): if n <= 2: return n + 1 result = np.mat([ [1, 0, 1], [1, 0, 0], [0, 1, 0] ], dtype='float64') ** (n - 2) * np.mat([3, 2, 1]).T return int(result[0, 0])
|