【发布时间】:2020-02-03 21:42:30
【问题描述】:
在考虑调用递归方法的方法的复杂度(引物方法)时,是考虑递归方法的复杂度,还是只考虑方法的调用。
例如,我有一个计算斐波那契数列的小程序:
// Complexity: ???
public int fib() {
int n = 9;
return fib(n);
}
// Complexity: O(2^n)
private int fib(int n) {
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
递归fib(int n)方法的复杂度是O(2^n),但我不确定fib()的复杂度是多少。
我的假设是复杂度为 1,因为它所做的只是定义和 int 并返回一个数字。
【问题讨论】:
-
在这种情况下,它的复杂性与
fib(int n)相同。任何方法的复杂性都不能低于它执行的最复杂的任务——例如,调用O(n^2)操作的方法本身必须至少为O(n^2)。 -
每个人都错了——它是
O(1),因为fib()不接受任何输入,因此它的运行时间是恒定的。 -
@BrentMB:如果您不提及要放任无穷大的输入参数是什么,那么复杂性分析就毫无意义。您的函数
fib()没有明显的输入。您要计算渐近运行时间的输入是什么?
标签: java recursion big-o code-complexity