Fibonacci数列

关于Fibonacci数列的方法,在think in Java一书中的第十五章泛型里面有具体的源代码:

public interface Generator<T> {
         T next();
}
public class Fibonacci implements Generator<Integer>{

       public static void main(String[] args) {
              test1 gen = new test1();
              for(int i = 0;i<18;i++){
                  System.out.print(gen.next()+" ");
              }
       }

       private int count=0;
       public Integer next() {return fib(count++);}

       private int fib(int n){
              if(n<2) return 1;
              return fib(n-2)+fib(n-1);
       }
}

以上是通过迭代,来将Fibonacci数列中的每一项依次迭代出来,每计算一次,前面的几项数都需要重新进行计算一次,因此,在循环次数i比较大的情况下(如i=50),程序运行非常慢。在此,我自己做了一个小小的改进,因为Fibonacci数列实际上只与3项数字相关,我在这里申请了3位的数组来存储这三项,在i=1,2的时候为递归的基准情形,将其置为特例。其后依次循环迭代即可,这样执行速度会明显快很多。代码如下:

public static void main(String[] args) {
	long[] gen = {1,1,1};
         for(int i = 0;i<100;i++){
             if(i<2) System.out.print(1+" ");
             else{
                  gen[0]=gen[1];
                  gen[1]=gen[2];
                  gen[2]=gen[1]+gen[0];
                  System.out.print(gen[2]+" ");
             }
        }
}

不过这里面也有个小bug,就是当i大到一定程度(如当i=100)时,long类型也不够存储所得到的数列值,后面一些值得精度会降低,这里如果想要再改进的话可以考虑java中的大数类了~

你可能感兴趣的:(Fibonacci数列)