2012-02-07 4 views
1

私はちょうど再帰を学ぶようになりました。そして、各レベルが明らかに正方形であるような砲弾の山の中に砲弾の数を見つけることを含む問題に固執しています。トップスタックは3分の1が16であるというように...再帰的なスタックフレームから戻ったときに値が保持されませんか?

The stack of cannonballs looks conceptually like this

私は変数の値を見てXcodeでの手順をトレースし、どのような私が見ていることということでてきた、第二は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; 
} 

私が手戻り値はです。

私のエラーや誤解のご意見やご指摘をお待ちしております。

ありがとうございます。

答えて

5

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

であなたはGetCannonballsの結果にnumBallsを設定するのを忘れ。あなたは

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

以上簡潔に行う必要があり、あなたがGetCannonballsのデフォルト引数を使用してラッパー関数を取り除くことができます

return GetCannonballs(height, 0); 

注:書き込みの

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

おめでとうございます途中で適切なテール再帰関数。

+0

すごいああ...私はそれはかなり恥ずかしいです...私はこの愚かなと明白なバグに費やすどのくらい信じられません。ああ、デバッグにはここで学ぶべきレッスンがあると思います。ありがとうセス、ムーンと私の名前を逃した他のanswerer :) – 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); 
} 
関連する問題