C++ 从递归堆栈帧返回时未保留值?

C++ 从递归堆栈帧返回时未保留值?,c++,recursion,C++,Recursion,我刚刚开始学习递归,我被困在一个问题上,这个问题涉及到在一堆炮弹中找到炮弹的数量,每个级别显然是一个平方数,例如,顶部堆栈是1,第二个是4,第三个是16,依此类推 我在Xcode中跟踪了观察变量值的步骤,我看到的是,当达到基本情况时,“numBalls”是正确的,但当堆栈帧结束时,该值不会返回并丢失 我觉得我应该知道如何解决这个问题,但我似乎想不出来 以下是我正在使用的代码: #include <iostream> using namespace std; int GetCann

我刚刚开始学习递归,我被困在一个问题上,这个问题涉及到在一堆炮弹中找到炮弹的数量,每个级别显然是一个平方数,例如,顶部堆栈是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;
}
#包括
使用名称空间std;
int获取炮弹(int高度,int数量球);
内部炮弹(内部高度);
int main(int argc,char*argv[]){
不能In

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

int numBalls = 0;
numBalls = GetCannonballs(height, 0);
return numBalls;
或者更简洁地说

return GetCannonballs(height, 0);
注意,您可以通过使用
GetCannonballs
的默认参数来摆脱包装器函数:

int GetCannonballs(int height, int numBalls = 0);
顺便说一句,祝贺您编写了一个正确的尾部递归函数。

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);
顺便说一句,祝贺您编写了正确的尾部递归函数。

更改:

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

更改:

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


哦,哇…我不敢相信我花了多长时间在这个愚蠢而明显的错误上…那真是太尴尬了。啊,好吧,在调试方面我想这是一个教训,哈哈。谢谢赛斯,月亮和另一个回答者,我错过了他的名字:)哦,哇…我不敢相信我花了多长时间在这个愚蠢而明显的错误上…那太尴尬了。啊,好吧,我想这是调试的一个教训,哈哈。谢谢赛斯、月亮和另一位回答者,我错过了他的名字:)