我对计算以下代码的时间和空间复杂度感兴趣,但是似乎很费劲。我知道递归可以达到的最深深度为n,因此空间应为O(n)。但是我不知道如何计算时间复杂度...当涉及类似于f(f(n-1))
这样的形式的递归时,我不知道如何编写公式。
如果是return f3(n-1) + f3(n-1)
之类的东西,那我知道它应该是O(2 ^ n),因为T(n)= 2T(n-1)正确吗?
代码如下:
int f3(int n)
{
if(n <= 2)
return 1;
f3(1 + f3(n-2));
return n - 1;
}
谢谢您的帮助!
答案 0 :(得分:0)
请注意,对于所有n,f3(n) = n - 1
,因此首先计算行f3(1 + f3(n-2))
,并返回f3(n-2)
,然后返回n - 3
= {{1 }}再次计算!
因此,f3(1 + n - 3)
两次计算f3(n-2)
,并产生一些f3(n)
开销。
我们得到了一些常数f3(n-2)
的递归公式O(1)
,而T(n) = 2T(n-2) + c
是c
的运行时间。
解决递归,我们得到T(n)
。