递归和非递归小算法的时空复杂度

时间:2015-04-26 17:45:51

标签: algorithm recursion time-complexity space-complexity non-recursive

考虑两个接受无符号整数作为参数的函数,并返回该数字的位数。一个函数是递归的,另一个函数是非递归的。

就复杂性而言,哪种实施更好?

使用的语言是C / C ++。

这是非递归函数:

int nbOfDigitsNR(int nb) {
int i=0
while(nb!=0){
 nb=nb/10; 
 ++i;
}
return i; // i is the number of digits 
}

递归函数:

int nbOfDigitsNR(int nb) {
 static int i;
 if (nb!=0){
 i=i+1;
 nbOfDigitsNR(nb/10);}
 return i;
}

我建议时间复杂度相同:O(n), 空间复杂度不同:O(n)递归。 O(1)非递归。

2 个答案:

答案 0 :(得分:0)

说一个函数是递归的或非递归的,并没有告诉我们任何关于它的复杂性。

它可能是相同的,或者其中一个具有较低的复杂性..它完全取决于算法。

我有一辆蓝色和灰色的汽车。哪一个更快?

答案 1 :(得分:0)

如果一个解决方案是递归的和其他迭代的,那么时间复杂度应该是相同的,如果这是相同的算法实现两次 - 一次递归和一次迭代。

区别在于空间复杂性以及编程语言(在您的情况下是C ++)如何处理递归。

您的示例恰恰说明了这一点。两个函数都具有相同的时间复杂度,而递归函数将具有更大的空间复杂度,因为C ++为堆栈上的每个递归调用分配变量。

如果n代表位数,那么你对时间和空间的复杂性是正确的。如果n表示整数,则将其替换为lg(n)。