我最初解决了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
}
答案 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)