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



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

就复杂度而言,哪种实现更好?

使用的语言是 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) 非递归。

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

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

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

您对时间和空间的复杂性是正确的,如果 n 表示位数。如果 n 表示整数,则用 lg(n) 替换它。

说一个函数是递归的或非递归的并不能告诉我们它的复杂性

它可以相等,也可以是复杂度较低的其中一个......这完全取决于算法。

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

相关内容

  • 没有找到相关文章

最新更新