从递归堆栈帧返回时不保留值?

时间:2012-02-07 00:30:14

标签: c++ recursion

我刚刚开始学习递归,而且我遇到了一个问题,即在一堆炮弹中发现炮弹的数量,每个级别显然是一个正方形数字,例如。顶部堆栈是1,第二个是4,第三个是16,依此类推......

The stack of cannonballs looks conceptually like this

我已经跟踪了Xcode中监视变量值的步骤,我看到的是当达到基本情况时'numBalls'是正确的但是当堆栈帧结束时,该值不会返回并丢失

我觉得我应该知道如何解决这个问题,但我似乎无法解决这个问题。

以下是我正在使用的代码:

#include <iostream>
using namespace std;

int GetCannonballs(int height, int numBalls);
int Cannonballs(int height);

int main(int argc, char *argv[]) {
    cout << Cannonballs(3) << endl;
}

int GetCannonballs(int height, int numBalls)
{
    if(height <= 0) {
        return numBalls;
    } else {
        return GetCannonballs(height-1, numBalls + (height*height));
    }
}

int Cannonballs(int height) // Wrapper function
{
    int numBalls = 0;
    GetCannonballs(height, 0);
    return numBalls;
}

我得到的返回值是 0

非常感谢我对错误或误解的任何帮助或解释!

谢谢。

2 个答案:

答案 0 :(得分:5)

int numBalls = 0;
GetCannonballs(height, 0);
return numBalls;

您忘记将numBalls设置为GetCannonballs的结果。你需要做

int numBalls = 0;
numBalls = GetCannonballs(height, 0);
return numBalls;

或者更简洁,

return GetCannonballs(height, 0);

请注意,您可以使用GetCannonballs的默认参数来删除包装函数:

int GetCannonballs(int height, int numBalls = 0);

祝贺顺便写一个正确的尾递归函数。

答案 1 :(得分:1)

变化:

int Cannonballs(int height) // Wrapper function
{
    int numBalls = 0;
    GetCannonballs(height, 0);
    return numBalls;
}

要:

int Cannonballs(int height) // Wrapper function
{
    return GetCannonballs(height, 0);
}