经过推论,斐波那契数列为:
红色的为斐波那契数列(也可以右下角)
可以看出,这是个矩阵的乘方。因此我们可以得出和乘方问题几乎一样的代码,只不过我们需要设置矩阵乘法的方法。(这个斐波那契数列从1开始)。
class Fibonacc{
int [][]b=new int[2][2];
public Fibonacc(int [][]b){
this.b=b;
}
public int[][] fibonacci(int a) {
if(a==1)
return b;
if(a%2==0) { //如果a为偶数
int[][]f=fibonacci(a/2);
return multiplication(f,f);
}
else { //a为奇数
int[][]f=fibonacci((a-1)/2);
return multiplication(multiplication(f,f),b);
}
}
public int[][] multiplication(int[][]p,int[][]q) { //矩阵乘法
int[][]c=new int[2][2];
c[0][0]=p[0][0]*q[0][0]+p[0][1]*q[1][0];
c[0][1]=p[0][0]*q[0][1]+p[0][1]*q[1][1];
c[1][0]=p[1][0]*q[0][0]+p[1][1]*q[1][0];
c[1][1]=p[1][0]*q[0][1]+p[1][1]*q[1][1];
return c;
}
}
public class TextFibonacci2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int b[][]={{1,1},{1,0}}; //传入矩阵
Fibonacc a=new Fibonacc(b);
System.out.print(a.fibonacci(10)[0][1]); //a为第几个斐波那契数。
}
}