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

Jar*_*rod 1 c++ recursion

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

炮弹堆在概念上看起来像这样

我已经跟踪了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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的返回值是0.

任何有关我的错误或误解的帮助或解释都将非常感谢!

谢谢.

Set*_*gie 5

int numBalls = 0;
GetCannonballs(height, 0);
return numBalls;
Run Code Online (Sandbox Code Playgroud)

你忘了设置numBalls结果GetCannonballs.你需要这样做

int numBalls = 0;
numBalls = GetCannonballs(height, 0);
return numBalls;
Run Code Online (Sandbox Code Playgroud)

或者更简洁,

return GetCannonballs(height, 0);
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过使用以下默认参数来摆脱包装函数GetCannonballs:

int GetCannonballs(int height, int numBalls = 0);
Run Code Online (Sandbox Code Playgroud)

恭喜你顺便编写了一个合适的尾递归函数.