关于c ++递归和局部变量的问题

kam*_*lot 8 c++ variables recursion scope

假设我有这个递归:

void doSomething(double j)
{
    double x;
    double y;

    x = j -1;
    y = j -2 ;

    doSomething(x+y);

    x = j + 31;
    y = j + 12 ;
}
Run Code Online (Sandbox Code Playgroud)

我知道这个递归无限执行,但只是忽略它

我的问题是关于变量x和y在递归树中的范围... x和y的范围是否仅对递归树中特定阶段的函数有效?或者当我再次调用doSomething()时,当递归树中的子doSomething()重新声明x和y时,它是否会重置父项的x和y变量,或者它是否创建了一个全新的x和y变量,它们是有效的仅在递归树中的那个阶段?

Mah*_*esh 10

x和y的范围是否仅对递归树中特定阶段的函数有效?

是.

当我再次调用doSomething(),并且递归树中的子doSomething(),重新声明x和y时,它会重置父项的x和y变量

没有.

是创建一个全新的x和y变量,只对递归树中的那个阶段有效吗?

是.

编辑1: 这个例子应该会有所帮助.

#include <iostream>

void foo( int temp )
{
     int num = temp;

     if( temp == 0)
          return; 

     foo(temp-1) ;

     std::cout << &num << "\t" << num << "\n" ;
}

int main()
{
     foo(5) ;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0xbfa4e2d0 1
0xbfa4e300 2
0xbfa4e330 3
0xbfa4e360 4
0xbfa4e390 5

注意num不同的地址,每次调用都有自己的值num. Ideone


Ern*_*ill 5

每次调用都会获得自己的变量副本。在一个函数调用中分配给副本不会影响任何其他函数调用中的版本。这就是递归必须通过传递参数和返回值在“阶段”之间进行通信的原因。