2012-02-07 215 views
1

我剛開始學習遞歸和我卡上包括尋找在炮彈一堆與每個級別顯然是一個平方數如炮彈的數量問題。棧頂是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; 
} 

返回值我得到的是。

任何幫助或我的錯誤或誤解的解釋將是非常讚賞!

謝謝。

回答

5

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

你忘記設置numBallsGetCannonballs結果。你需要做的

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

或者更簡潔,

return GetCannonballs(height, 0); 

注意,您可以通過使用缺省參數GetCannonballs擺脫包裝功能:在寫

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

恭喜順便提一下適當的尾遞歸函數。

+0

哇哦......我無法相信我多久花在這個愚蠢和明顯的bug ......這是相當尷尬的。不錯啊,有一個教訓在這裏調試瞭解到我想,哈哈。謝謝塞斯,月亮和我錯過了其他回答者的名字:) – Jarrod 2012-02-07 00:37:21

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