0%

斐波那契数列的矩阵求法

题目

母牛每年生一头母牛, 新出生的母牛成长三年后也能每年生一头母牛, 假设牛不会死. 求 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));
}
}
1
28
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])