【发布时间】:2017-11-12 01:48:09
【问题描述】:
这段代码的大 O 是多少?我知道所有的行都是 O(1),除了递归部分。我不确定递归的大 O 是多少,我感觉它仍然是 O(1),因为我们没有比 O(1) 更糟糕的行,但通常递归是 O(n)。
代码:
public int getSum(int a, int b) {
if (b == 0){
return a;
}
if (a == 0){
return b;
}
int add = a ^ b;
int carry = (a&b) << 1;
return getSum(add, carry);
}
编辑:顺便说一句,这不是作业,是为面试做准备。
【问题讨论】:
-
我认为递归调用最多 32 次,因为肯定比
carry == 0,因为位移位你用完了位。可以这么说。因此 O(1)。 -
@jerrybibo - 不必如此。您也可以定义大 O 以获得最佳和平均运行时间。
-
O(1)是一个恒定复杂度,在这种情况下怎么可能是@martijnn2008,因为最后有一个递归方法,不是每次都调用!我认为这是一个 线性复杂度O(n)!例如 1 次调用:1 秒 10 次:10 秒 等等。 -
@GhostCat 是的,我意识到这些问题不能在这里问,谢谢你让我注意到这一点。我删除了这个问题。
-
感谢您的反馈以及您的积极反应。不是每个人都会在这样的庄园里做出反应......