Я пытаюсь понять взаимосвязь между итерацией и рекурсией, пытаясь смоделировать упрощенное выполнение тела операторов в пределах области {} на старом домашнем задании, которое у меня было. Предположим, у меня есть два типа операторов: while и оператор присваивания.«Выполнение» тела операторов без рекурсии
В настоящее время я предполагаю, что условие while while всегда верно. EDIT: Кроме того, предположим, что оператор пока только выполняет один раз (то есть, я бы назвал это, если заявление)
В рекурсии, это было бы просто:
executeBody(body)
{
for each stmt in body
{
switch (stmt)
{
case ASSIGNMENT:
// work
break;
case WHILE-STMT:
executeBody(whileStmt->body)
break;
}
}
}
Но я имея проблемы с этим для итерации. Я знаю, что мне нужно смоделировать стек, но я просто не могу концептуализировать, как выполнять все инструкции в инструкции while, прежде чем перейти к следующему утверждению. Вот модель того, что у меня есть:
executeBody(body)
{
for each stmt in body
{
case ASSIGNMENT:
// work
break;
case WHILE-STMT:
{
stack<body> stack;
stack.push(whileStmt->body);
while (stack isNotEmpty)
{
for each stmt (in each body) in stack
{
case ASSIGNMENT:
// work;
break;
case WHILE-STMT:
//stack.push(this_whileStmt->body);
// ????
break;
}
}
}
}
}
EDIT: Изменен пример рекурсии, чтобы показать, что тело представляет собой последовательность операторов.
- это итерационный psudo-код, который вы разместили правильно, или это ваш собственный код. –
Его собственный код - это неверно, так как он не закончен. – Vance
Я бы начал с 'while (cond) cmd', где cmd может быть выражением или блоком. Затем вы сохраняете стек кортежей cmd/cond/exec. Когда вы нажмете некоторое время, если cond, нажмите тройку. Стандартные блоки подталкивают ложный cond. Внешняя петля состоит в том, чтобы продвинуть состояние exec сверху на стек, получить cmd, handle. Если выполняется самое верхнее, проверьте состояние cond и pop или reset exec. – Yakk