先决条件:递归
程序使用的内存有时与运行时间一样重要,特别是在诸如移动设备之类的受限环境中。
例如,如果我们需要创建一个大小为n的数组,则将需要O(n)空间。如果我们需要一个大小为nxn的二维数组,它将需要O(n 2 )。
递归调用中的堆栈空间也算作程序所需的额外空间。
例如 :
CPP
int sum(int sum)
{
if (n <= 0)
return 0;
return n + sum(n-1);
}
Java
static int sum(int sum)
{
if (n <= 0)
return 0;
return n + sum(n - 1);
}
// This code is contributed by Pratham76
C#
static int sum(int sum)
{
if (n <= 0)
return 0;
return n + sum(n - 1);
}
// This code is contributed by rutvik_56
CPP
// A non-recursive code that makes n calls
// but takes O(1) extra space.
int pairSumSequence(int n)
{
int sum = 0;
for (int i=0; i
在上面的示例函数,每个调用都会向堆栈添加一个新级别。
Sum(5)
->sum(4)
->sum(3)
->sum(2)
->sum(1)
->sum(0)
这些调用中的每一个都添加到调用堆栈中,并占用实际内存。因此,这样的代码将花费O(n)时间和O(n)辅助空间。
但是,仅仅因为您总共有n次调用并不意味着它占用了O(n)空间。考虑以下函数,该函数在0和n之间添加相邻元素:
例子:
CPP
// A non-recursive code that makes n calls
// but takes O(1) extra space.
int pairSumSequence(int n)
{
int sum = 0;
for (int i=0; i