2012-01-09 2 views
1

그래서 스택 오버플로 오류가 발생하는 재귀 함수가 있습니다. 나는 비주얼 스튜디오 2010에서 꼬리 재귀와 0x 최적화를 적용 해 보았습니다. 아직 운이 없습니다. 어떤 도움을 주시면 감사하겠습니다. while 루프를 만들 수도 있지만 재귀 함수를 배우고 싶었습니다.꼬리 재귀를 사용하여 스택 오버플로를 막으려 고 시도했습니다.

#include <cstdio> 
#include <cstdlib> 
#include <stdio.h> 
#include <string.h> 
#include <Windows.h> 

#define BOARD_SIZE 64 

int horizontal[8]; 
int vertical[8]; 

bool board[BOARD_SIZE]; 

typedef struct _MoveOrder 
{ 
int row; 
int col; 
int move; 
} MoveOrder; 

MoveOrder sMoveOrder[BOARD_SIZE]; 

void MoveHelper(); 
void Move(int currentMove); 


void main() 
{ 
horizontal[0] = 2; 
horizontal[1] = 1; 
horizontal[2] = -1; 
horizontal[3] = -2; 
horizontal[4] = -2; 
horizontal[5] = -1; 
horizontal[6] = 1; 
horizontal[7] = 2; 

vertical[0] = -1; 
vertical[1] = -2; 
vertical[2] = -2; 
vertical[3] = -1; 
vertical[4] = 1; 
vertical[5] = 2; 
vertical[6] = 2; 
vertical[7] = 1; 

memset(sMoveOrder, 0, sizeof(MoveOrder) * BOARD_SIZE); 

for(int i = 0; i < BOARD_SIZE; i++) 
{ 
    sMoveOrder[i].move = -1; 
} 

for(int i = 0; i < BOARD_SIZE; i++) 
{ 
    board[i] = false; 
} 

sMoveOrder[0].col = 0; 
sMoveOrder[0].row = 0; 

MoveHelper(); 

system("pause"); 

return; 
} 

void MoveHelper() 
{ 
return Move(0); 
} 

static void Move(int currentMove) 
{ 
int tempRow = 0; 
int tempCol = 0; 
int tempMove = sMoveOrder[currentMove].move; 
bool bChangeRoute = true; 

if(tempMove == -1) 
{ 
    tempMove = 0; 
} 
else 
{ 
    ++tempMove; 
} 

for(int i = tempMove; i < 8; i++) 
{ 
    tempCol = sMoveOrder[currentMove].col + horizontal[i]; 
    tempRow = sMoveOrder[currentMove].row + vertical[i]; 

    if(tempRow >= 0 && tempRow <= 7) 
    { 
     if(tempCol >= 0 && tempCol <= 7) 
     { 
      if(!board[tempCol + (tempRow * 8)]) 
      { 
       board[tempCol + (tempRow * 8)] = true; 

       sMoveOrder[currentMove].move = i; 

       ++currentMove; 
       sMoveOrder[currentMove].col = tempCol; 
       sMoveOrder[currentMove].row = tempRow; 

       bChangeRoute = false; 

       if(currentMove >= BOARD_SIZE - 1) 
       { 
        printf("full\n"); 
        for(int i = 0; i < BOARD_SIZE; i++) 
        { 
         if(!board[i]) 
         { 
          printf("%d\n", i); 
         } 
        } 
        printf("full complete\n"); 

        system("pause"); 
        return; 
       } 

       break; 
      } 
     } 
    } 
} 

if(bChangeRoute) 
{ 
    board[sMoveOrder[currentMove].col + (sMoveOrder[currentMove].row * 8)] = false; 
    sMoveOrder[currentMove].move = -1; 

    --currentMove; 
    if(currentMove <= 0) 
    { 
     currentMove = 0; 

     sMoveOrder[currentMove].col += 1; 

     if(sMoveOrder[currentMove].col >= 8) 
     { 
      sMoveOrder[currentMove].col = 0; 
      sMoveOrder[currentMove].row += 1; 

      if(sMoveOrder[currentMove].row >= 8) 
      { 
       printf("broken: %d\n", currentMove); 

       system("pause"); 
       return; 
      } 
     } 
    } 
} 


return Move(currentMove); 

} 
+1

, 내 첫번째 생각은 오히려에 ** stackoverflow.com ** 다음에 갔다 실제 문제. ^^ – Aufwind

+0

스택 오버 플로우 오류를주는 대신 영원히 반복해야하기 때문에 꼬리 호출 최적화를 수행하지 않는 것으로 보인다. 나는 컴파일하고 무슨 일하지만 난 코드의 일부가 누락하고 무엇을보고 시도 : - 보드를 - sMoveOrder - BOARD_SIZE - sMoveOrder - 수평 -주십시오 수직 모든 코드는 그래서 우리는 정확한 당신을 도울 시도 할 수 있습니다 우리가 추측 한 코드 대신에 사용하고있는 코드. :) – Pedrom

답변

1

귀하의 기능에는 정지 조건이 없습니다. 모든 메모리가 사용될 때까지

는 기본적으로 함수는 (스택 오버플로) 자체를 호출 내가 제목을 읽을 때

void MyRecursiveCall(argument) 
{ 
    Check Stop condition //return 
    .. 
    ..Doing stuff 
    ..   

    MyRecursiveCall(nextArguement) 
} 
+0

잠깐 멈추라 고 프로그램하고 싶기 때문에 내 수익이 주석 처리되었지만 그들이 자리를 잡았을 때 도움이되지 않았습니다. – user998797

관련 문제