2010-04-13 64 views
2

我想提請任何遞歸方法調用堆棧,所以我創建了這樣一個模式,繪製調用堆棧的遞歸方法

recursiveMethod(){ 
    //Break recursion condition 
    if(){ 
    // Add value here to the return values' list- No drawing 
    return 
    } 
    else{ 
    //Draw stack with the value which will be pushed to the stack here 
    variable <- recursiveMethod() 
    //Clear the drawing which represents the poped value from the stack here 
    return variable 
}} 

應用架構將看起來像這樣,

alt text http://i40.tinypic.com/11tbrdf.jpg

注:

  1. 此架構可以通過在遞歸調用中使遞歸調用在單獨的返回語句中進行遞歸調用,從而得出遞歸調用方法n
  2. returnValues列表是一個保存所有返回值的列表,僅用於查看問題。
  3. 繪製堆棧意味着,只需繪製一個簡單的單元格「矩形」+繪製推送的字符串。

您怎麼看待這個問題?任何建議都非常受歡迎。

+2

「繪製堆疊」是什麼意思?也許我不瞭解情況。 – WhirlWind 2010-04-13 00:35:24

+0

我編輯了我的帖子。 「繪製堆棧意味着,只需繪製一個簡單的單元格」矩形「+繪製推送的字符串。」 – Lisa 2010-04-13 00:48:22

+0

該方案看起來可行。我建議在圍繞它構建GUI之前在ascii中嘗試它。 – Beta 2010-04-13 17:09:46

回答

1

我不確定我是否正確理解您的問題,但會採取刺探措施,讓我知道如果這是不正確的。

我收集的是,你想要一些方法來跟蹤你的遞歸函數堆棧。你可以做到這一點的一個方法是有一個堆棧數據結構和一個繪製數據結構的函數,你想要繪製它的方式取決於你,現在可能只是畫一個類似[---]的棧,其中'-'是遞歸深度。

這裏是一個近似的類似於C++的例子:

因此,我們有:

Stack recursiveFunctionTrackingStack; //Stack of something, maybe just '-' 

void DrawStack(const Stack& aStack); 

和另一種類型是這樣的:

struct StackUpdater 
{ 
    StackUpdater(){ recursiveFunctionTrackingStack.push('-'); } 
    StackUpdater(const string& somevalue) 
    { 
     recursiveFunctionTrackingStack.push(somevalue); 
    } 
    ~StackUpdater(){ recursiveFunctionTrackingStack.pop(); } 
} 

所以 'StackUpdater' 推入到堆棧的東西數據結構創建時會創建一個對象,並在其被破壞時將其彈出。

現在遞歸函數我們可以做(使用您的代碼段)內:

recursiveMethod(){ 
    if(){ return } 
    else{ 
    { 
     StackUpdater su(pushedInValue); //Value pushed 
     variable <- recursiveMethod(); 
     DrawStack(recursiveFunctionTrackingStack); 
    } //Value popped on destruct. 
    DrawStack(recursiveFunctionTrackingStack); 
    return variable 
}} 

也許你想要的是沿着這些線路的東西。如果沒有,請澄清你的問題。

希望這有助於反正。