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

Posted 静若飘絮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波那契数列递归内存溢出如何解决相关的知识,希望对你有一定的参考价值。

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

以上是关于斐波那契数列递归内存溢出如何解决的主要内容,如果未能解决你的问题,请参考以下文章

算法递归算法 ① ( 使用递归推导斐波那契数列 | 递归内存开销分析 | 递归三要素 : 定义 拆解 出口 )

如何用递归解决斐波那契数列

08《算法入门教程》递归算法之斐波那契数列

九度oj 题目1075:斐波那契数列

编写一递归函数求斐波那契数列的前40项

关于斐波那契数列和递归