以递归方法绘制调用堆栈

时间:2010-04-13 00:30:53

标签: algorithm recursion

我想为任何递归方法绘制调用堆栈,所以我创建了一个这样的模式,

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. 通过在单独的return语句中进行递归调用,此模式可以使用 n 递归调用绘制递归方法。
  2. returnValues list,是一个保存所有返回值的列表,仅用于查看问题。
  3. 绘制堆栈意味着,只需绘制一个简单的单元格“矩形”+绘制推送的字符串。
  4. 你怎么看待这个?任何建议都非常欢迎。

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了你的问题,但是会对它进行一次尝试,如果这是不正确的,请告诉我。

我收集的是你想要一些方法来跟踪你在递归函数中的堆栈。你可以做到这一点的一种方法是拥有一个Stack数据结构,一个绘制数据结构的函数,你希望如何绘制它取决于你,现在可能只是像[---]那样绘制堆栈。 '-'是递归深度。

这是一个近似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'在创建对象时会在Stack数据结构上推送一些东西,并在它被破坏时弹出它。

现在在我们可以做的递归函数中(使用你的代码片段):

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

也许你想要的是沿着那条线。如果没有,那么请澄清你的问题。

希望这无论如何都有帮助。