具有多个函数调用的递归函数的大O?

时间:2017-03-29 13:07:16

标签: recursion time-complexity big-o

我无法确定此递归函数的最坏情况时间复杂度:

long f(int n) {
  if(n <= 0) return 1;
  else {
    return f(n / 2) + f(n / 2) + f(n / 2);
  }
}

据我所知,如果你刚刚返回f(n / 2)一次,那就是O(log n)。所以我想知道是否有三,四,五等时间会影响功能的大O.谢谢!

1 个答案:

答案 0 :(得分:0)

乘以常量从不会影响复杂性。当然,执行时间大致是三倍,但问题是时间如何相对于 n 的值增加,而不是时钟所说的。

请注意,这很容易适用,因为您使用相同的值调用相同的函数;

可以可靠地取代
return 3 * f(n/2)

如果您有三个不同的来电,例如

return f(n/2) + f(int(sqrt(n)) + f(n-1)

...然后你必须计算每个的复杂性,并考虑最复杂的。这个功能并不难;然而,由于具有更复杂的功能,例如Collat​​z序列,您在考虑所有二阶和三阶复杂度时会遇到更困难的时间。调用间接递归函数(例如

)也会遇到更多麻烦
long f(int n);

long g(int n) {
  if(n <= 2) return 1;
  else {
    return f(n*n mod 10) + g(n-2);
  }
}

long f(int n) {
  if(n <= 0) return 1;
  else {
    return f(n / 2) + g(n / 2);
  }
}

结论:您的问题很简单,但请注意后续问题。