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

时间:2016-04-27 14:19:56

标签: java

我最初解决了Project Euler问题#2,该问题计算了甚至数量达到4,000,000的斐波纳契序列。我完成了这个,然后我想增加最大数量,以便它可以无限延续,结果更慢,因为计算时间更长。

我遇到了堆栈溢出错误,并想知道代码是否有替代解决方案,以便它能够继续运行,虽然速度很慢,但不会遇到堆栈溢出错误。

有人可以帮我重构我的解决方案吗?感谢。

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

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
  }

4 个答案:

答案 0 :(得分:1)

你的问题是你没有终止条件来停止递归,你会继续前进直到你的堆栈空间耗尽。

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

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);
  }
}

注意:这不是一个严格的规则,只是一般概要。

答案 1 :(得分:1)

这会计算出记住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;
    }

答案 2 :(得分:0)

以下功能与您的代码相同,只是没有递归调用;因此,它将在没有StackOverflowError

的情况下无限期运行
  private static void fibonacci(long first, long second, long sum) {
    while(true) {
      long number = first + second;       
      if (number % 2 == 0){ //Checks for even number
        sum = sum + number;
      }
      System.out.println(sum);

      first = second;
      second = number;
    }
  }

然而,正如其他人所指出的,它将无限期地运行字面,因为没有什么可以打破循环。

答案 3 :(得分:0)

您有两种选择:

  • 使用算法的迭代版本,例如this
  • 或在运行Java时增加堆栈大小,更多details
相关问题