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

Recursion - Declaring variable in the body or use it as a parameter?

本文关键字:参数 变量 主体 声明 递归      更新时间:2023-10-16

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

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);
    ...
    ...
}

在空间复杂性方面,哪一个更有效?它们有什么区别吗?我们可以说,当递归调用生成参数的副本时,在函数中声明变量与将其用作参数是一样的吗?

从内存消耗的角度来看,函数参数与本地变量相同。也就是说,从内存消耗的角度来看,这两种变体之间没有区别,除了在main中引入了一个完全不必要的局部变量。

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