2012-02-07 2 views
1

저는 재귀를 배우기 시작했습니다. 각 레벨이 분명히 정사각형 숫자 인 대포 더미에있는 대포의 수를 찾는 문제에 봉착했습니다. 상위 스택은재귀 적 스택 프레임에서 복귀 할 때 값이 유지되지 않습니까?

The stack of cannonballs looks conceptually like this

나는 변수의 값을보고 엑스 코드의 단계를 추적하고 무엇을 제가 보는 것은 있다는 것입니다했습니다 ... 세 번째 등 16이고, 두 번째는 4, 1 기본 케이스에 도달하면 '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입니다 : 여기

내가 사용하고 코드입니다.

내 오류 또는 오해의 도움말이나 설명은 매우 감사드립니다!

감사합니다.

답변

5

int numBalls = 0; 
GetCannonballs(height, 0); 
return numBalls; 

에서 당신은 GetCannonballs의 결과에 numBalls을 설정하는 것을 잊지. 작성에

int GetCannonballs(int height, int numBalls = 0); 

축하합니다 : 당신은 더 간결

int numBalls = 0; 
numBalls = GetCannonballs(height, 0); 
return numBalls; 

또는, GetCannonballs에 대한 기본 인수를 사용하여 래퍼 함수 제거 할 수

return GetCannonballs(height, 0); 

주의 할 필요가 그런 꼬리 재귀 함수.

+0

오 와우 ... 내가이 바보와 명백한 버그에 소요되는 시간을 믿을 수 없어 ... 그건 매우 당황. 아하, 디버깅에 대해 배워야 할 교훈이 있습니다. 하하. 감사합니다 세스, 문 및 다른 답변자는 누구의 이름을 내가 그리워 :) – Jarrod

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); 
} 
관련 문제