我刚刚写了这篇文章,但是由于某些原因,在控制台中,我得到了一些看起来正确但顺序错误的数字,有些数字是重复的。有什么问题吗?
public class Fibonacci {
public static void main(String[] args) {
int n = 5;
fibonacci(n);
}
public static int fibonacci(int n) {
if(n == 0) {
System.out.println(0);
return 0;
} else if(n == 1) {
System.out.println(1);
return 1;
} else {
int result = fibonacci(n - 1) + fibonacci(n - 2);
System.out.println(result);
return result;
}
}
}
您的程序正确计算了斐波那契数。这是在fibonacci
的顶级调用中打印的最后一个数字。
某些数字被重复打印,因为它们被多次计算。 fibonacci(5)
调用fibonacci(4) + fibonacci(3)
,后者调用fibonacci(3) + fibonacci(2) + fibonacci(2) + fibonacci(1)
,并且我们已经有两个单独的具有相同参数的递归调用。随着递归调用的进一步下降,重复调用将更多。
对于较低的输入,例如5
,这是可以的,但是对于较大的数字,您将遇到性能问题,因为此算法本质上是指数的。复杂度为O(2 n
即使您的程序当前是正确的,也可以通过将对fibonacci
的中间调用的结果存储在数组中来消除指数复杂度,而用线性复杂度(O(n))代替。这样,每个中间步骤仅计算一次。
[如果您想查看斐波那契数列直到设置的项,请从fibonacci(int n)
方法中删除所有输出,而在主行中只有一个print
方法处于从1到您的for
循环中设定期限。
fibonacci
方法的递归调用。 fib
的4调用堆栈为: