斐波那契数列递归内存溢出如何解决
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项已经求出。
以上是关于斐波那契数列递归内存溢出如何解决的主要内容,如果未能解决你的问题,请参考以下文章