平时一般求Fibonacci数列都是用递归求的,其实还可以利用矩阵的幂求,如果递归时间复杂度是指数的(2^n),而矩阵分治来求是logn的。
为求A的n次幂,使用了分治法,复杂度为O(log(n))。这个结论可以用数学归纳法证明。
直接上代码:
package edu.pku.ss.hlj;
public class Matrix_N {
static int[][] matrix;
public static void main(String[] args) {
init(2);
matrix[0][0] = 1;
matrix[0][1] = 1;
matrix[1][0] = 1;
matrix[1][1] = 0;
int[][] temp = new int[matrix.length][matrix.length];
temp = pow(4);
for (int[] a : temp) {
for (int b : a) {
System.out.print(b + " ");
}
System.out.println();
}
System.out.println("斐波那契数列的fn值为:" + temp[0][1]);
}
public static void init(int n) {
matrix = new int[n][n];
}
public static int[][] matrixMulti(int[][] m, int[][] n) {
int[][] temp = new int[matrix.length][matrix.length];
for (int k = 0; k < matrix.length; k++) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
temp[k][i] += m[k][j] * n[j][i];
}
}
}
return temp;
}
public static int[][] pow(int n) {
int[][] temp = new int[matrix.length][matrix.length];
if (n == 1) {
return matrix;
} else {
if (n % 2 != 0) {
temp = pow((n - 1) / 2);
temp = matrixMulti(temp, temp);
return matrixMulti(temp, matrix);
} else {
temp = pow(n / 2);
temp = matrixMulti(temp, temp);
return temp;
}
}
}
}