【发布时间】:2016-09-28 16:29:38
【问题描述】:
int factorial(int n)
{
if(n < 0) {return -1;}
if(n == 0) {return 1;}
return n*factorial(n-1);
}
为了找到时间复杂度,我创建了一个递归关系
T(n) = T(n-1) + c = T(n-2) + 2c = ... = T(n-k) + kc => O(n)
T(0) = 1;
为这类算法(如斐波那契)找到空间复杂度的一般方法是什么?我们需要找到调用堆栈的深处吗?
【问题讨论】:
-
那么你将不得不递归调用它n次,每次调用都会在堆栈上分配自己的带有局部变量的帧,所以空间复杂度是n的顺序。
-
每次调用
factorial函数都会在内存的“堆栈”部分为该调用创建一个堆栈帧。单个堆栈帧将包含此函数中定义的变量、函数中的参数和返回地址。在这种情况下,对于每个呼叫,可以在恒定时间内存储此信息。由于此函数的调用次数是线性的,因此总内存将为 O(n)。