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);
}
, 내 첫번째 생각은 오히려에 ** stackoverflow.com ** 다음에 갔다 실제 문제. ^^ – Aufwind
스택 오버 플로우 오류를주는 대신 영원히 반복해야하기 때문에 꼬리 호출 최적화를 수행하지 않는 것으로 보인다. 나는 컴파일하고 무슨 일하지만 난 코드의 일부가 누락하고 무엇을보고 시도 : - 보드를 - sMoveOrder - BOARD_SIZE - sMoveOrder - 수평 -주십시오 수직 모든 코드는 그래서 우리는 정확한 당신을 도울 시도 할 수 있습니다 우리가 추측 한 코드 대신에 사용하고있는 코드. :) – Pedrom