【问题标题】:Drawing the call stack in a recursive method以递归方法绘制调用堆栈
【发布时间】:2019-07-23 05:11:21
【问题描述】:

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

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

应用架构会看起来像这样,

注意事项:

  1. 此架构可以通过在单独的 return 语句中进行递归调用来绘制具有 n 个递归调用的递归方法。
  2. returnValues 列表,是一个保存所有返回值的列表,仅供查看问题。
  3. 绘制栈的意思是,简单地绘制一个简单的单元格“矩形”+绘制推送的字符串。

你怎么看这个?任何建议都非常受欢迎。

【问题讨论】:

  • “绘制堆栈”是什么意思?可能我信息不灵通。
  • 我已经编辑了我的帖子。 “画栈的意思,简单的画一个简单的单元格‘矩形’+画推入的字符串。”
  • 这个方案看起来可行。我建议在围绕它构建 GUI 之前在 ascii 中尝试它。
  • “在 ascii 中尝试”是什么意思??
  • 你用什么语言编写程序?我猜是 c#,因为您在其他问题 (stackoverflow.com/questions/2750477/…) 中使用了它。我认为您应该为您的问题添加该语言的标签。

标签: algorithm recursion


【解决方案1】:

我不确定我是否正确理解了您的问题,但会试一试,如果这不正确,请告诉我。

我收集到的是,您希望通过某种方式在递归函数中跟踪您的堆栈。您可以做到这一点的一种方法是拥有一个 Stack 数据结构和一个绘制数据结构的函数,您希望如何绘制它取决于您,现在可能只是将堆栈绘制为 [---] 与 @ 987654322@是递归深度。

这是一个类似 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 数据结构上,并在销毁时将其弹出。

现在我们可以在递归函数中执行(使用您的代码 sn-p):

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

也许你想要的是类似的东西。如果不是,请澄清您的问题。

希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多