zoukankan      html  css  js  c++  java
  • 斐波那契数列递归内存溢出如何解决

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

  • 相关阅读:
    【leetcode】1030. Matrix Cells in Distance Order
    【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays
    【leetcode】1032. Stream of Characters
    L120 单词造句
    L119
    L118
    2018.8.6邮件规范一
    L117
    L116
    L115
  • 原文地址:https://www.cnblogs.com/duange/p/6413192.html
Copyright © 2011-2022 走看看