Рисование стека вызовов в рекурсивном методе - PullRequest
2 голосов
/ 13 апреля 2010

Я хочу нарисовать стек вызовов для любого рекурсивного метода, поэтому я создал такую ​​схему,

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

Применение схемы будет выглядеть примерно так,

альтернативный текст http://i40.tinypic.com/11tbrdf.jpg

Примечания:

  1. Эта схема может рисовать рекурсивные методы с помощью n рекурсивного вызова, делая рекурсивные вызовы в отдельных операторах возврата.
  2. returnValues ​​list, список, в котором сохраняются все возвращаемые значения, только для просмотра проблем.
  3. Нарисуйте стек означает, просто нарисуйте простую ячейку «прямоугольник» + Рисование толкаемой строки.

Что вы думаете об этом? любые предложения крайне приветствуются.

1 Ответ

1 голос
/ 15 апреля 2010

Я не уверен, правильно ли я понимаю ваш вопрос, но постараюсь ответить на него, дайте мне знать, если это неправильно.

Я понял, что вы хотите каким-то образом отслеживать свой стек внутри рекурсивной функции. Один из способов сделать это - иметь структуру данных 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
}}

Может быть, вы хотите что-то в этом роде. Если нет, уточните, пожалуйста, вопрос.

Надеюсь, это все равно поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...