时间和空间的复杂性是什么:
int superFactorial4(int n, int m)
{
if(n <= 1)
{
if(m <= 1)
return 1;
else
n = m -= 1;
}
return n*superFactorial4(n-1, m);
}
通过将n的值减1来递归运行,直到它等于1,然后它将m的值减1或者在m等于1的情况下返回1。
我认为复杂性取决于n和m,所以可能是O(n * m)。
答案 0 :(得分:3)
时间复杂度为O(n+m^2)
,空间复杂度相同。
推理:使用固定值m
,函数对自身进行n
递归调用,每个函数都是常量工作,因此具有固定m
的调用的复杂性为{{1 }}。现在,当n达到零时,它变为n
,m-1
也变为m
。因此,下一个固定m阶段将采用m-1
,下一个m-1
,依此类推。因此,您获得的总和m-2
为(m-1)+(m-2)+...+1
。
空间复杂度相等,因为对于每次递归调用,递归都占用常量空间,除了最后,你不会从递归返回,并且没有尾递归。
答案 1 :(得分:3)
实际上,它看起来更接近O(N + m ^ 2)。 n仅用于第一个“循环”。
此外,在任何不进行尾调用优化的语言中,空间复杂度可能会“失败”。在支持优化的语言中,空间复杂度更像是O(1)。
答案 2 :(得分:-1)
使用递归的因子函数的时间复杂度 伪代码:
int fact(n)
{
if(n==0)
{
return 1;
}
else if(n==1)
{
return 1;
}
else if
{
return n*f(n-1);
}
}
time complexity;
let T(n) be the number of steps taken to compute fact(n).
we know in each step F(n)= n*F(n-1)+C
F(n-1)= (n-1)*F(n-2)+c
substitute this in F(n), we get
F(n)= n*(n-1)*F(n-2)+(n+1)c
现在使用大写符号我们可以说
F(n)>= n*F(n-1)
F(n)>= n*(n-1)*F(n-2)
.
.
.
.
.
F(n)>=n!F(n-k)
T(n)>=n!T(n-k)
n-k=1;
k=n-1;
T(n)>=n!T(n-(n-1))
T(n)>=n!T(1)
since T(1)=1
T(n)>=1*n!
现在是
的形式 F(n)>=c(g(n))
所以我们可以说使用递归的阶乘的时间复杂度是
T(n)= O(n!)