斐波那契數列遞歸內存溢出如何解決


斐波那契數列指的是這樣一個數列 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項已經求出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM