2012-09-30 2 views
0

이 재귀를 수행 할 때 stackoverflow 오류가 발생합니다. 패턴이있다,이 첫 번 말한다 :재귀를 수행 할 때 Stackoverflow

라인 MazeGui.move (MazeGui.java:79)에서

경우 (참 rigting.goal == ) {

및 그것은 다음 두 가지를 말하고, 둘 다 출력에서 ​​매우 오랜 시간 동안 반복됩니다. 문제는 어디 난 그냥 잘 모르겠어요 여기에 무슨 일이 일어나고 있는지 :

라인 이동 (rigting.right, POS)입니다 MazeGui.move (MazeGui.java:89) 에서

; // 이동 ​​라인 움직임이다 MazeGui.move (MazeGui.java:107) 에서 오른쪽

(rigting.left, POS); // 이동 ​​

...

가 나는 종료 조건 또는 뭔가를 놓치고 있습니까

이 일어나고 어떤 무한 재귀가 ...

를 왼쪽? 나는 그 주위에 내 머리를 감쌀 수 없다. 완전히 잃어 버렸다. 어떤 도움을 주시면 감사하겠습니다.

코드 : 당신이 뭔가를 시도 할 수도

public boolean move(Maze rigting, int pos) 
{ 
    if (rigting.goal == true) 
    { 
     return true; 
    } 
    if (rigting.wallR != true) 
    { 
     pos += 1; 
     move(rigting.right, pos); //moves right 

     showLabel(pos); 
     return true; 
    } 
    if(rigting.wallD != true) //checks if there is a wall below 
    { 
     pos += 10; 
     move(rigting.down, pos); //moves down 

     showLabel(pos); 
     return true; 
    } 
    if(rigting.wallL != true) //checks if there is a wall on the left 
    { 
     pos -= 1; 
     move(rigting.left, pos); //moves left 

     showLabel(pos); 
     return true; 
    } 
    if(rigting.wallU != true) //checks if there is a wall above 
    { 
     pos -= 10; 
     move(rigting.up, pos); //moves up 

     showLabel(pos); 
     return true; 
    } 

    return false; 
} 
+0

예. 스택 오버플로는 대개 중지 조건이 충족되지 않음을 의미합니다. – raam86

답변

0

,

public boolean move(Maze rigting, int pos) 

{ 
    if (rigting.goal == true) 
    { 
     return true; 
    } 

    if (rigting.wallR != true) 
    { 
     pos += 1; 
     showLabel(pos); 
     return move(rigting.right, pos); //moves right 
    } 

    if(rigting.wallD != true) //checks if there is a wall below 
    { 
     pos += 10; 
     showLabel(pos); 
     return move(rigting.down, pos); //moves down 
    } 
    if(rigting.wallL != true) //checks if there is a wall on the left 
    { 
     pos -= 1; 
     showLabel(pos); 
     return move(rigting.left, pos); //moves left 
    } 

    if(rigting.wallU != true) //checks if there is a wall above 
    { 
     pos -= 10; 
     showLabel(pos); 
     return move(rigting.up, pos); //moves up 
    } 

    return false; 
} 
1

귀하의 "경로 지정"알고리즘은 간단한 재귀 루프를 가지고있다.

이 경우 알고리즘은 올바르게 이동해야한다고 계산합니다. 그런 다음 한 번 실행하면 왼쪽으로 이동해야한다고 계산합니다. 일단 왼쪽으로 이동하면 마지막으로 있던 위치로 되돌아갑니다. 시작 위치로 돌아 왔기 때문에 사이클이 다시 시작되어이 방법이 무한히 계속됩니다 (또는 실제로 스택 오버플로가 발생할 때까지).

가능한 해결책은 응용 프로그램의 상태를 분석하고 상태가 업데이트 될 때마다 이전에 그 상태에 있었는지 여부를 감지하는 것입니다. 그렇다면 그에 따라 행동을 수정하십시오.

관련 문제