递归函数可以更改函数原始调用中的变量吗?

时间:2016-10-03 10:36:49

标签: java c++ function recursion

例如。假设我有一个名为recursionFunction的函数。在此函数中,我将变量userInput设置为等于用户输入的值,然后调用函数本身。在递归中输入的用户输入是否会更改原始变量?

我的查询来自我对范围和地址的小理解。 如果函数不同,则不应将变量识别为同一变量。但它是'同一功能',不是吗?它应该在RAM中具有相同的地址,因此会被覆盖?或者它是否具有相同的地址,尽管具有相同的变量名称的相同功能?

忽略这样一个函数会导致无限循环的事实。让我们假装我有办法停止这个程序。这不是一个意见问题,它显然只会像我描述的那样发生。提前谢谢。

我主要从事Java工作,我正在努力学习C ++,这就是为什么要包含这些标签的原因。

编辑:模拟代码(同样,我知道会发生无限循环,让我们假装它没有)递归会改变原始调用中的userInput变量吗?

int recursionFunction()
{
    int userInput;

    std::cin >> userInput;

    recursionFunction();

    return 0;
}

3 个答案:

答案 0 :(得分:4)

您实际上是在询问递归调用期间局部变量会发生什么。答案很简单 - 每个函数调用都有自己的堆栈框架,即这些局部变量完全相互隔离。该图有助于:(source

enter image description here

执行此代码后显示堆栈:

function f(int x, int y) {
    int a;
    if ( term_cond ) return ...;
    a = .....;
    return g(a);
    }

function g(int z) {
    int p,q;
    p = ...; q = ...;
    return f(p,q);
    }

答案 1 :(得分:1)

是的,如果您将变量userInput声明为static,则可以。这意味着变量不会在堆栈上,而是在堆上有一个固定的位置。所以它就像一个全局变量,但它只能从函数内部访问。

答案 2 :(得分:0)

不,除非使用pass by reference作为调用方法。

每个功能都有自己的范围。只有当您发送并操作指向内存的指针时,它才会相同。

在这个例子中,它们永远不会干扰(虽然这是一个永远不会退出的无限循环,最终会产生堆栈溢出......)

void RecursionFunction(void)
{
  unsigned int uiVal;
  uiVal = input();
  RecursionFunction();
}

这里始终是每次递归中更改的内存区域

void RecursionFunction(unsigned int* uiVal)
{
  *uiVal = input();
  RecursionFunction(uiVal);
}

void main()
{
  unsigned int uiVal;
  RecursionFunction(&uiVal)
}

和引用(也会改变相同的内存区域):

void RecursionFunction(unsigned int &uiVal)
{
  uiVal = input();
  RecursionFunction(uiVal);
}

void main()
{
  unsigned int uiVal;
  RecursionFunction(uiVal)
}