首页 > 代码库 > 斐波那契数列递归内存溢出如何解决

斐波那契数列递归内存溢出如何解决

斐波那契数列指的是这样一个数列 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项已经求出。

斐波那契数列递归内存溢出如何解决