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

Algorithm 递归和非递归小算法的时空复杂度,algorithm,recursion,time-complexity,space-complexity,non-recursive,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!=

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

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

使用的语言是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;
}
递归函数:

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)非递归。

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

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


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

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

<> P>差异是由于空间复杂性,以及编程语言,在C++ C++中,如何处理递归。 你的例子正好说明了这一点。这两种函数都具有相同的时间复杂度,而递归的一种将具有更大的空间复杂度,因为C++为堆栈上的每个递归调用分配变量。p>
如果n表示位数,则时间和空间的复杂性是正确的。如果n代表整数,然后用lg(n)替换它。

你可以使用O(1)算法计算位数:
numDigits(x){return floor(log_10(x)+1)}
我认为时间复杂度都是O(n),其中n是迭代次数!!!!!向我们展示您的实现,以及您的假设和论点,这些假设和论点可以增强它们的复杂性,然后我们可以讨论它们。没有你的精神参与,我们不会做你的家庭作业。你无法回答这个问题。我曾经编写过一个编译器,它可以检测左/右递归并将其更改为循环。@halex这是我的建议,感谢您的参与。事实上,我们知道空间复杂性至少和递归一样深。@icepack:nope。。例如,如果它是尾部递归的,那么这种复杂性就可以消除。@ZEMA:这显然是错误的。去掉那个
静态
变量。阅读编辑。你的建议是好的,如果你的意思是正确的东西n。你的n必须是数字,而不是数字。