递归 - 在体内声明变量或将其用作参数?

Ame*_*men 3 c++ recursion

这个递归函数有什么区别:

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);
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

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);
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪一个在空间复杂性方面更有效?他们有什么不同吗?我们可以说,当递归调用复制参数时,声明函数中的变量与将其用作参数相同吗?

AnT*_*AnT 5

从内存消耗的角度来看,函数参数与本地vartiable相同.即,除了你引入了一个完全不必要的局部变量这一事实之外,从内存消耗的角度来看,两种变体之间没有区别main.

但是,第二个变体可能在时间上不那么有效,因为在每个递归级别,您将当前值传递temp到下一级递归.根本没有使用该值(从中接收到的main值甚至没有初始化),这意味着任何CPU花在将其传递到那里的努力都被完全浪费了.