考虑以下C函数:
double foo (int n) {
int i;
double sum;
if (n==0)
return 1.0;
else {
sum = 0.0;
for (i=0; i<n; i++)
sum +=foo(i);
return sum;
}
}
上述功能的空间复杂性为:
(a)O(1)(b)O(n)(c)O(n!)(d)O(n ^ n)
我所做的是计算上述代码的递归关系,但我仍然无法解决这种复发问题。我知道这不是家庭工作相关的网站。但任何帮助都会受到赞赏。
这是我的再次发生。
T(n)= T(n-1)+ T(n-2)+ T(n-3)+ T(n-4)+ ........ + T(1)+小号
其中S是常数。
答案 0 :(得分:4)
这取决于你是在讨论堆栈还是堆空间复杂性。
对于堆,它是O(1)
或O(0)
,因为你没有使用堆内存。 (除基本系统/程序开销外)
对于堆栈,它是O(n)
。这是因为递归得到了N
级别的深度。
最深点是:
foo(n)
foo(n - 1)
foo(n - 2)
...
foo(0)
答案 1 :(得分:2)
空间复杂性描述了程序需要多少空间。由于foo
未声明数组,因此每个级别都需要O(1)
个空格。现在你需要做的就是弄清楚在任何给定时间最多可以激活多少个嵌套级别。
编辑:......让你自己找出解决方案:)
答案 2 :(得分:1)
您没有解释如何推导出您的递归关系。我会这样做:
foo
使用常量空间(没有递归)。foo
为每个i从0到n-1(包括)递归一次。对于每个递归,它使用常量空间(对于调用本身)加上T(i)空间用于递归调用。但这些呼叫是一个接一个地发生的;每个呼叫使用的空间在下一个呼叫之前释放。因此,不应添加它们,而应仅添加最大值。这将是T(n-1),因为T是非减少的。答案 3 :(得分:1)
空间复杂度为O(n)。正如你所提到的,它可能看起来像是O(n * n),但是应该记住,在循环中调用say(i = 1)时,就会删除堆栈中用尽的空间。因此,当i = n-1时,你将不得不考虑最坏的情况。然后,最大数量的递归函数调用将同时在堆栈上