1

私が持っていた古い宿題のスコープ { } 内の一連のステートメントの単純化された実行をモデル化することによって、反復と再帰の関係を把握しようとしています。while ステートメントと代入ステートメントの 2 つのステートメント タイプがあるとします。

今のところ、while ステートメントの条件は常に true であると想定しています。 編集: また、while ステートメントが 1 回だけ実行されると仮定します (つまり、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;
          }
       }
    }  
  }
}

編集: 再帰の例を変更して、本文が一連のステートメントであることを示しました。

4

2 に答える 2

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宣言でこれを行っています)、現在のブロックで再開されます。現在のステートメントをパージし、作業ブロックをスタックにプッシュする全体的な目的は、このように再開できるようにすることです。

于 2013-05-01T18:30:59.613 に答える
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;
        }
    }
}

この疑似コードは、すべてのボディがスタックにあることを明確にする必要があります。ASSIGNMENT を実行するものもあれば、WILE を実行するものもあります。

于 2013-05-01T18:26:16.517 に答える