斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........某一項是前兩項的和。使用遞歸調用時前四十項求解沒有問題,但到底五十項的時候會出現內存溢出,求不出結果。所以要想求出更多的項必須使用非遞歸的方法求解,數據類型不能再是int,可以為double。
1、內存溢出的實例
package test.only; import java.util.Scanner; public class DiGui01 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print("輸入一個正整數:"); int i=sc.nextInt(); double k01=sum01(i); System.out.println("1、第"+i+"項的值為"+k01); sc.close(); } public static double sum01(int i){ if(i<=2) return 1; else return sum01(i-1)+sum01(i-2); }; }
結果(未內存溢出結果):
內存溢出結果
2、修改方法,使用非遞歸求項,數組。
package test.only; import java.util.Scanner; public class DiGui01 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print("輸入一個正整數:"); int i=sc.nextInt(); double k02=sum02(i); System.out.println("2、第"+i+"項的值為"+k02); //double k01=sum01(i); //System.out.println("1、第"+i+"項的值為"+k01); sc.close(); } public static double sum01(int i){ if(i<=2) return 1; else return sum01(i-1)+sum01(i-2); }; public static double sum02(int i){ double[] a=new double[i+1]; a[2]=a[1]=1; for(int k=3;k<=i;++k) a[k]=a[k-1]+a[k-2]; return a[i]; } }
結果
由圖知,斐波那契數列的第50項已經求出。