还有一种是利用矩阵来计算,这种方法是最快的,感兴趣的可以搜一下。
这里的方法其实有两种,一种是递归,一种是迭代,其他的都是在迭代的基础上使用不同的数据结构而已。
package test;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Vector;
public class Fibonacci {
//递归实现
private long fibonacci1(int n) throws Exception{
if(n<=0)
return 0;
if(n==1)
return 1;
return fibonacci1(n-1)+fibonacci1(n-2);
}
//迭代实现
private long fibonacci2(int n) throws Exception{
if(n<0)
throw new Exception("Invaild paramter");
int[] result = {0, 1};
if(n < 2 )
return result[n];
long fibNMinusOne = 1;
long fibNMinusTwo = 0;
long fibN = 0;
for(int i=2; i<=n; ++i){
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
//公式实现
private double fibonacci3(int n){
double gh5 = Math.sqrt((double)5);
return (Math.pow((1+gh5),n)-Math.pow((1-gh5), n))/(Math.pow((double)2, n)*gh5);
}
//队列实现
private int fibonacci4(int n){
Queue<Integer> queue = new LinkedList<>();
if(n<0){
return -1;
}
queue.offer(0);
queue.offer(1);
for(int i=2; i<=n; ++i){
queue.offer(queue.poll()+queue.peek());
}
queue.poll();
return queue.peek();
}
//向量实现
private int fibonacci5(int n){
if(n<0){
return -1;
}
Vector<Integer> vector = new Vector<>();
vector.addElement(0);
vector.addElement(1);
for(int i=2; i<=n; ++i){
vector.addElement(vector.firstElement()+vector.lastElement());
vector.remove(0);
}
return vector.lastElement();
}
//数组实现
private int fibonacci6(int n){
if(n<0)
return -1;
if(n<3){
return 1;
}
int[] data = new int[n+1];
data[0] = 0;
data[1] = 1;
for(int i=2; i<n+1; ++i){
data[i] = data[i-1]+data[i-2];
}
return data[n];
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
int n = 3 ;
int n1 = 5 ;
int n2 = 10 ;
int n3 = 0 ;
int n4 = 1 ;
int n5 = 2 ;
int n6 = 40 ;
Fibonacci fibonacci = new Fibonacci();
System.out.println(n+" : "+fibonacci.fibonacci1(n)+" : "+fibonacci.fibonacci2(n)+" : "+fibonacci.fibonacci3(n)+" : "
+fibonacci.fibonacci4(n)+" : "+fibonacci.fibonacci5(n)+" : "+fibonacci.fibonacci6(n));
System.out.println(n1+" : "+fibonacci.fibonacci1(n1)+" : "+fibonacci.fibonacci2(n1)+" : "+fibonacci.fibonacci3(n1)+" : "
+fibonacci.fibonacci4(n1)+" : "+fibonacci.fibonacci5(n1)+" : "+fibonacci.fibonacci6(n1));
System.out.println(n2+" : "+fibonacci.fibonacci1(n2)+" : "+fibonacci.fibonacci2(n2)+" : "+fibonacci.fibonacci3(n2)+" : "
+fibonacci.fibonacci4(n2)+" : "+fibonacci.fibonacci5(n2)+" : "+fibonacci.fibonacci6(n2));
System.out.println(n3+" : "+fibonacci.fibonacci1(n3)+" : "+fibonacci.fibonacci2(n3)+" : "+fibonacci.fibonacci3(n3)+" : "
+fibonacci.fibonacci4(n3)+" : "+fibonacci.fibonacci5(n3)+" : "+fibonacci.fibonacci6(n3));
System.out.println(n4+" : "+fibonacci.fibonacci1(n4)+" : "+fibonacci.fibonacci2(n4)+" : "+fibonacci.fibonacci3(n4)+" : "
+fibonacci.fibonacci4(n4)+" : "+fibonacci.fibonacci5(n4)+" : "+fibonacci.fibonacci6(n4));
System.out.println(n5+" : "+fibonacci.fibonacci1(n5)+" : "+fibonacci.fibonacci2(n5)+" : "+fibonacci.fibonacci3(n5)+" : "
+fibonacci.fibonacci4(n5)+" : "+fibonacci.fibonacci5(n5)+" : "+fibonacci.fibonacci6(n5));
System.out.println(n6+" : "+fibonacci.fibonacci1(n6)+" : "+fibonacci.fibonacci2(n6)+" : "+fibonacci.fibonacci3(n6)+" : "
+fibonacci.fibonacci4(n6)+" : "+fibonacci.fibonacci5(n6)+" : "+fibonacci.fibonacci6(n6));
}
}