Java 使用递归和循环打印斐波那契数列的时间和空间复杂性
使用递归和循环打印斐波那契数列的时间和空间复杂度(大O表示法)是多少?有一个用于打印斐波那契数的循环,在计算时间和空间复杂度时是否也包括该循环 我下面的分析正确吗 使用递归Java 使用递归和循环打印斐波那契数列的时间和空间复杂性,java,big-o,complexity-theory,fibonacci,Java,Big O,Complexity Theory,Fibonacci,使用递归和循环打印斐波那契数列的时间和空间复杂度(大O表示法)是多少?有一个用于打印斐波那契数的循环,在计算时间和空间复杂度时是否也包括该循环 我下面的分析正确吗 使用递归 public int-printfibonacci系列(int-n){ 如果(n这可能是一个更好的评论,但因为我没有足够的代表,这里开始- 您可以在这里看到递归实现是如何占用空间O(n)而不是O(1),因为递归树是在它们全部添加和关闭之前构建的 (注意-链接视频中的时间戳显示了Fac(n)函数的图表,但随后在视频Fib函数中
public int-printfibonacci系列(int-n){
如果(n这可能是一个更好的评论,但因为我没有足够的代表,这里开始-
您可以在这里看到递归实现是如何占用空间O(n)而不是O(1),因为递归树是在它们全部添加和关闭之前构建的
(注意-链接视频中的时间戳显示了Fac(n)函数的图表,但随后在视频Fib函数中也对其进行了解释,但由于没有图表,因此附上了此图)也不能是O(1)空间复杂度。递归排除了第一个,并且new int[n]
第二种情况是不可能的。这比我写一个完整的答案要花更多的时间,所以简短的版本是:递归解的空间复杂度是O(n)。空间复杂度衡量的是运行算法需要多少空间,而不是算法返回后使用了多少空间。知道它是O(n)意味着数字越大,避免堆栈溢出所需的调用堆栈越大。(续)O(n2^n)的时间复杂度是正确的,尽管仅供参考,它不是一个严格的上界。如果你想要一个严格的上界,数学是相当复杂的;它涉及到一些复杂的代数,可能不值得研究。
public int printFibonacciSeries(int n) {
if (n <= 1) {
return n;
}
return printFibonacciSeries(n - 1) + printFibonacciSeries(n - 2);
}
public static void main(String[] args) {
...
FibonacciSeries fibonacciSeries = new FibonacciSeries();
for (int i = 0; i < n; i++) {
System.out.println("i=" + i + " and " + fibonacciSeries.printFibonacciSeries(i));
}
}
public void printFibonacciSeriesWithLoop(int n) {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
if (i <= 1) {
arr[i] = i;
} else {
arr[i] = arr[i-1] + arr[i-2];
}
}
Arrays.stream(arr).forEach(System.out::println);
}
public static void main(String[] args) {
...
FibonacciSeries fibonacciSeries = new FibonacciSeries();
fibonacciSeries.printFibonacciSeriesWithLoop(i);
}