Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免Fibonacci序列堆栈溢出错误_Java - Fatal编程技术网

Java 避免Fibonacci序列堆栈溢出错误

Java 避免Fibonacci序列堆栈溢出错误,java,Java,我最初是在解决项目Euler问题2,该问题计算的斐波那契数列的偶数高达4000000。我完成了这个,然后我想增加最大值,这样它将无限地继续下去,随着计算时间的延长,产生的结果会更加缓慢 我遇到了一个堆栈溢出错误,我想知道是否有其他解决方案可以让代码继续运行,尽管速度很慢,但不会遇到堆栈溢出错误 有人能帮我重构解决方案吗?谢谢 下面提供了此问题的相关代码 public static void main(String[] args) { fibonacci(1,2,2); } pr

我最初是在解决项目Euler问题2,该问题计算的斐波那契数列的偶数高达4000000。我完成了这个,然后我想增加最大值,这样它将无限地继续下去,随着计算时间的延长,产生的结果会更加缓慢

我遇到了一个堆栈溢出错误,我想知道是否有其他解决方案可以让代码继续运行,尽管速度很慢,但不会遇到堆栈溢出错误

有人能帮我重构解决方案吗?谢谢

下面提供了此问题的相关代码

public static void main(String[] args) {
    fibonacci(1,2,2);
  }

  private static void fibonacci(long first, long second, long sum) {
       long number = first + second;       
         if (number % 2 == 0){ //Checks for even number
           sum = sum + number;
         }
         System.out.println(sum);
         fibonacci(second, number, sum);
         // Produces the following error:
         // Exception in thread "main" java.lang.StackOverflowError
  }

您的问题是,您没有终止条件来停止递归,您将继续进行,直到堆栈空间用完为止

伪代码中递归函数的一般格式为:

return-typo function(some, values)
{
  if(got to the end of recursion based on some values)
  {
    return something;
  }
  else
  {
    // Recurse
    return function(changes to some values);
  }
}

注意:这不是一条硬性规定,只是一个概述。

以下内容在功能上与代码相同,只是没有递归调用;因此,它将在没有StackOverflower错误的情况下无限期运行:


然而,正如其他人所指出的,它将无限期地运行,因为没有任何东西可以打破循环。

这将计算出记忆2个数字的斐波那契

private static BigDecimal fibonacci(int n) {

        BigDecimal cur = new BigDecimal(1);
        BigDecimal prev = new BigDecimal(0);

        //System.out.println(0+") "+1);

        for (int i=1; i<n; i++) {
            final BigDecimal next = cur.add(prev);
            prev = cur;
            cur = next;
            //System.out.println(i+") "+next);
        }

        return cur;
    }

你有两个选择:

或者使用算法的迭代版本,例如 或者在运行Java时增加堆栈大小,等等
不要使用递归,使用循环。中断递归调用的基本条件在哪里?@Gangaraju看起来像是在向后做fibo。。。从1开始,趋于无穷大。他希望递归永远不会停止,所以他没有一个基本情况。除非它很快会返回一个太大的数字,无法放入一个长的中。@FredK,这时它会悄悄溢出并继续进行。谢谢,我会给它一个goThanks,我不希望有一个边界条件,因为我想无限计算。@Hiphop03199-如果没有其他数据类型long在某个点溢出,则不能无限计算。
private static BigDecimal fibonacci(int n) {

        BigDecimal cur = new BigDecimal(1);
        BigDecimal prev = new BigDecimal(0);

        //System.out.println(0+") "+1);

        for (int i=1; i<n; i++) {
            final BigDecimal next = cur.add(prev);
            prev = cur;
            cur = next;
            //System.out.println(i+") "+next);
        }

        return cur;
    }