这个递归函数有什么区别:
int foo (int n,int sum)
{
if (n==0)
return sum;
int temp;
cin>>temp;
return foo(n-1,sum+temp);
}
int main()
{
...
...
foo(n,0);
...
...
}
和这一个:
int foo (int n,int sum, int temp)
{
if (n==0)
return sum;
cin>>temp;
return foo(n-1,sum+temp,temp);
}
int main()
{
...
int temp;
foo(n,0,temp);
...
...
}
哪一个在空间复杂性方面更有效?他们有什么不同吗? 我们可以说,当递归调用复制参数时,声明函数中的变量与将其用作参数相同吗?
答案 0 :(得分:5)
从内存消耗的角度来看,函数参数与本地vartiable相同。即除了你在main
中引入了一个完全不必要的局部变量之外,从记忆消费的角度来看,两种变体之间没有区别。
然而,第二个变体可能在时间上不那么有效,因为在每个递归级别,您将当前值temp
传递到下一级递归。根本没有使用该值(从main
收到的值甚至没有初始化),这意味着任何CPU花在将其传递到那里的努力都被完全浪费了。