我刚刚开始学习递归,而且我遇到了一个问题,即在一堆炮弹中发现炮弹的数量,每个级别显然是一个正方形数字,例如。顶部堆栈是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;
}
我得到的返回值是 0 。
非常感谢我对错误或误解的任何帮助或解释!
谢谢。
答案 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);
}