考虑两个接受无符号整数作为参数的函数,并返回该数字的位数。一个函数是递归的,另一个函数是非递归的。
就复杂性而言,哪种实施更好?
使用的语言是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)非递归。
答案 0 :(得分:0)
说一个函数是递归的或非递归的,并没有告诉我们任何关于它的复杂性。
它可能是相同的,或者其中一个具有较低的复杂性..它完全取决于算法。
我有一辆蓝色和灰色的汽车。哪一个更快?答案 1 :(得分:0)
如果一个解决方案是递归的和其他迭代的,那么时间复杂度应该是相同的,如果这是相同的算法实现两次 - 一次递归和一次迭代。
区别在于空间复杂性以及编程语言(在您的情况下是C ++)如何处理递归。
您的示例恰恰说明了这一点。两个函数都具有相同的时间复杂度,而递归函数将具有更大的空间复杂度,因为C ++为堆栈上的每个递归调用分配变量。
如果n代表位数,那么你对时间和空间的复杂性是正确的。如果n表示整数,则将其替换为lg(n)。