【发布时间】:2013-04-25 18:59:39
【问题描述】:
我试图通过在我的旧家庭作业上对范围 { } 内语句体的简化执行建模来掌握迭代和递归之间的关系。假设我有两种语句类型: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;
}
}
}
}
}
编辑:更改了递归示例以显示主体是一系列语句。
【问题讨论】:
-
是您发布正确代码的迭代伪代码还是您自己的代码
-
这是我自己的代码 - 这是不正确的,因为它还没有完成
-
我会以
while(cond) cmd开头,其中 cmd 可以是语句或块。然后你维护一堆 cmd / cond / exec 状态元组。当你打了一会儿,如果条件,推三倍。标准块推动虚假条件。外循环是将栈顶的exec状态推进,获取cmd,handle。如果最上面已经完成,请检查 cond 并弹出或重置 exec 状态。 -
主体是一系列语句。我已经修改了递归示例,添加了一个 for each 和 switch 语句
-
“在递归中,这很简单”或者可能不是。每个 while 语句的主体只执行一次,这并不完全正确。