提问者:小点点

阶乘计算的大O(时间复杂度)是多少?


迭代版本是线性的:

// O(n)
function factorial (n) {
  let ret = 1;
  for(let i = 2; i <= n; i++) {
    ret = ret * i;
  }
  return ret;
}

对于递归版本来说,它似乎也是线性的:

function factorialR (n) {
  if( n === 0 || n === 1 ) {
    return 1;
  } else {
    return n * factorialR(n - 1);
  }
}

递归版本也是线性的吗?它不是每个附加值的循环,而是一个附加的函数调用。


共2个答案

匿名用户

您的两个函数的时间复杂度都为O(n)

第一个很简单。

第二个在每次迭代中调用一次递归函数,因此它也是O(n)

匿名用户

如果你的算法是递归的,每个级别有b个递归调用,并且有L个级别,那么算法的复杂度大致是O(b^L)

但这只是一个粗略的上限。实际的复杂度取决于每个级别做了什么动作,以及是否可以剪枝

信用:斯蒂芬·哈利姆

对于更深入和复杂的递归时间复杂度,请访问此处