2010-04-13 2 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. Эта схема может нарисовать рекурсивные методы с помощью рекурсивного вызова с помощью рекурсивных вызовов в отдельных операторах возврата.
  2. returnValues ​​list - это список, который сохраняет все возвращаемые значения, только для просмотра проблем.
  3. Draw stack означает, просто нарисуйте простую ячейку «прямоугольник» + Рисование нажатой строки.

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

+2

Что означает «нарисовать стек»? Возможно, я плохо информирован. – WhirlWind

+0

Я редактировал свой пост. «Рисование стека, просто нарисуйте простую ячейку« прямоугольник »+ Рисование нажатой строки». – Lisa

+0

Эта схема выглядит работоспособной. Я предлагаю попробовать его в ascii, прежде чем создавать вокруг него графический интерфейс. – Beta

ответ

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

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

Надеюсь, это поможет в любом случае.

Смежные вопросы