关于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中的大数类了~