我试图通过尝试在我的旧作业中对范围{}内的一组语句的简化执行来模拟迭代和递归之间的关系。假设我有两种语句类型:while语句和赋值语句。
现在,我假设while语句的条件总是正确的。 编辑:另外,假设while语句只执行一次(即,我应该称之为if语句)
在递归中,这很简单:
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;
}
}
}
}
}
编辑:更改了递归示例,以显示正文是一系列语句。
答案 0 :(得分:2)
首先,我会抛弃你的外环。这是多余的。
stack< body > stack;
stack.push(body);
while (stack isNotEmpty)
{
for each stmt (in stack.pop()) // pop the top statement off of your stack
{
case ASSIGNMENT:
// work;
stmt.Remove()
/*you don't need to break here. just go onto the next operation*/
case WHILE-STMT:
stack.push(stmt->body);
stmt.Remove()
stack.push(stmt);
break;
}
一旦你遇到WHILE-STMT:
的情况,代码就会中断并继续堆栈的顶部项目,这就是你刚刚放在那里的代码块。
一旦该块执行完毕,它将从堆栈中弹出(您在for
声明中执行此操作),它将从当前块恢复。清除当前语句并将工作块推回堆栈的全部目的是为了能够像这样恢复。
答案 1 :(得分:1)
你的堆栈位置错误。它应该在executeBody例程的顶部声明。看看这个:
executeBody(body) {
stack<body> work;
stack.push(body);
while (stack isNotEmpty) {
item = stack.pop();
switch (item) {
case ASSIGNMENT:
// work;
break;
case WHILE-STMT:
stack.push(item);
break;
}
}
}
这个伪代码应该清楚地表明你所有的身体都在堆栈上。他们中的一些做了分配,有些做了WHILE。