【问题标题】:Value not retained when returning from recursive stack frames?从递归堆栈帧返回时不保留值?
【发布时间】:2012-02-07 08:39:45
【问题描述】:

我刚刚开始学习递归,我遇到了一个问题,该问题涉及在一堆炮弹中找到炮弹的数量,每个级别显然是一个平方数,例如。栈顶是 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

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

谢谢。

【问题讨论】:

    标签: c++ recursion


    【解决方案1】:

    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);
    

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

    【讨论】:

    • 哇哦...我不敢相信我在这个愚蠢而明显的错误上花了多长时间...这很尴尬。嗯,我猜这里有一个关于调试的教训,哈哈。感谢 Seth、Moon 和其他我错过了名字的回答者 :)
    【解决方案2】:

    变化:

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

    收件人:

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

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 1970-01-01
      • 2020-10-27
      • 2011-11-08
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      相关资源
      最近更新 更多