2010-04-13 65 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 
}} 

也许你想要的是沿着这些线路的东西。如果没有,请澄清你的问题。

希望这有助于反正。