public int algo(int n) {
if (n == 1) {
return 1;
}
algo(n/2);
for (int i = 0; i < 4; i++) {
System.out.print(i);
}
return 0;
}
我知道递归调用意味着它是T(n/2)
但是for循环将如何影响递归关系?
我认为for循环将运行log n
次,因为每次运行algo(int n)
时它都会运行。 algo
运行log n次,因为n继续被除以2.此外,for循环运行4次迭代。所以我认为它会在重复时添加额外的4 log n
,因此它将是O(n)= T(n / 2)+ 4 log n。
答案 0 :(得分:5)
因为for循环是恒定时间,并且不随n变化。它不应该影响时间复杂性。
答案 1 :(得分:2)
这里你在每次递归调用中将n除以2,for loop
不依赖于输入n,因此时间复杂度为O(logn)
。
由for loop
添加的时间复杂度是不变的,因此它将被丢弃。
在计算时间复杂度时,您必须担心输入会发生什么变化。这里for loop
不依赖于输入n
,因此在计算时间复杂度时不符合条件。
答案 2 :(得分:0)
具体来说,for循环对递归关系的影响最多是平凡。没有for循环,你的重复关系将是:
T n = T n / 2 + c
其中 c 是检查n==1
以及方法调用和返回的开销。 for循环总是打印4次,因此总是在 k 操作中执行。新的重复关系是:
T n = T n / 2 + c + ķ
令人兴奋......我们还有一个常数( c + k )我们之前有 c ,所以我们得到相同的O(log n )。