Значение не сохраняется при возврате из рекурсивных кадров стека? - PullRequest
1 голос
/ 07 февраля 2012

Я только начинаю изучать рекурсию, и я застрял в проблеме, которая включает в себя поиск количества пушечных ядер в куче пушечных ядер, причем каждый уровень, очевидно, представляет собой квадратное число, например.верхний стек равен 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 ]

5 голосов
/ 07 февраля 2012

В

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 голос
/ 07 февраля 2012

Изменение:

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

Кому:

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