2013-05-01 2 views
1

이전 숙제 과제에서 범위 {} 내에 명령문 본문을 단순화 한 실행을 모델링하여 반복 및 재귀 간의 관계를 파악하려고합니다. while 문과 대입 문이라는 두 개의 문 유형이 있다고 가정 해 보겠습니다.재귀없이 명령문 본문을 "실행"

지금은 while 문이 항상 참이라고 가정합니다. 편집 : 난,

executeBody(body) 
{ 
    for each stmt in body 
    { 
    switch (stmt) 
    { 
     case ASSIGNMENT: 
     // work 
     break; 

     case WHILE-STMT: 
     executeBody(whileStmt->body) 
     break; 
    } 
    } 
} 

을하지만 : 또한, 단 한 번 실행하는 동안 문을 가정

재귀,이 간단한 것 (즉, 나는 if 문 것은 그것이라고해야) 반복을 위해이 작업을 수행하는 데 문제가 있습니다. 스택을 시뮬레이트 할 필요가 있지만 다음 문으로 이동하기 전에 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

은 정확한 코드를 게시 한 psudo-code이거나 자신의 코드입니다 –

+0

내 자신의 코드입니다 - 올바르지 않습니다. 완료되지 않았습니다. – Vance

+0

'while (cond) cmd'입니다. 여기서 cmd는 명령문 또는 블록이 될 수 있습니다. 그런 다음 cmd/cond/exec 상태 튜플 스택을 유지합니다. 잠시 만났을 때, 콘돔이라면 트리플을 누르십시오. 표준 블록은 잘못된 조건을 푸시합니다. 바깥 쪽 루프는 최상위 스택의 exec 상태를 진행시키고 cmd를 얻고 핸들을 얻는 것입니다. 최상위 작업이 완료되면 cond 및 pop을 확인하거나 exec 상태를 재설정하십시오. – Yakk

답변

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 선언에서이 작업을 수행하고 있음). 그러면 현재 블록에서 재개됩니다. 현재 구문을 제거하고 작업 블록을 다시 스택으로 밀어 넣는 모든 목적은 이와 같이 다시 시작할 수 있도록하기위한 것입니다.

+0

루프가 실행 된 후 이것이 올바르게 다시 시작되는 것을 볼 수 없습니다. 'stmt.Remove()'는 무엇을합니까? – phant0m

+0

@ phant0m 'while 문'을 일반'코드 블록 '(정확하게 OP의 재귀 적 예제와 유사)으로 처리한다는 것 외에는 다시 시작할 때 어떻게 될 것이라고 생각하십니까? –

+0

@ phant0m 블록에서 명령문을 제거해야합니다. –

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

이 의사 코드는 모든 신체가 스택에 있다는 것을 분명히합니다. 그들 중 일부는 배정을하고 일부는 배타적입니다.

+1

WHILE_STMT에서 stack.push (item-> body)를 읽어야합니다. 그렇지 않으면 무한 루프가됩니다. –

+0

사소한 변경 사항 : 스택에 while-stmt 항목을 반복적으로 푸시하려면 루프가 필요합니다. – SuperSaiyan

+0

원래 두 번째 코드 조각은 'body'가 일련의 명령문임을 나타냅니다. 귀하의 코드는 그것에 어떤 종류의 반복도하지 않습니다. – phant0m

관련 문제