2012-09-24 3 views
1

스택 오버 플로우가있는 코드에서 무한 재귀 문제가 있음을 알고 있습니다. 나는 그것을 고치기위한 방법을 모른다. 도움을 주시면 감사하겠습니다.C에서 무한 재귀를 해결합니다 #

public Point WorldToMapCell(Point worldPoint) 
{ 
    return WorldToMapCell(new Point((int)worldPoint.X, (int)worldPoint.Y)); 
} 

public MapCell GetCellAtWorldPoint(Point worldPoint) 
{ 
    Point mapPoint = WorldToMapCell(worldPoint); 
    return Rows[mapPoint.Y].Columns[mapPoint.X]; 
} 

public MapCell GetCellAtWorldPoint(Vector2 worldPoint) 
{ 
    return GetCellAtWorldPoint(new Point((int)worldPoint.X, (int)worldPoint.Y)); 
} 
+1

종료 할 방법이 필요합니다. 보통 기본 케이스. –

답변

2

무한 재귀 (그 결과 스택 오버플로) 당신이 그 일을 그만 직접, 또는 간접적으로, 어떤 기회없이 반복적으로 자신을 호출하는 기능을 가지고 때 발생합니다. 첫 번째 함수 인 WorldToMapCell은 무조건적으로 호출되어이 문제를 일으 킵니다.

+0

그래서, 반환에 조건을 넣어야합니까? – Scott

+2

글쎄, 나는 꼭 그런 말을하지 않을 것이다. 'WorldToMapCell'이해야 할 일은 무엇입니까? 그것은 스스로를 호출하기로되어 있습니까 (실제로는 이해가 안됩니다), 아니면 다른 함수를 호출해야합니까? 이 기능이 필요합니까? –

2

재귀가 작동하려면 메서드에 기본 사례가 있어야합니다. 그렇지 않으면 무한 루프를 반복하여 막히게됩니다.

숫자의 계승을 계산하는 경우를 생각해

재귀가 작동하기 위해서는
public int factorial(int x) { 
    if (x == 0) 
     return 1; 
    else 
     return x * factorial(x - 1); 

는 계승 방법은 당신의 방법에서 X = 0, 당신은 어떤을 기본 케이스를, 접근 기본 케이스쪽으로 나아가고, 따라서, 당신의 방법은 그 자체를 영원히 계속 호출 할 것입니다.

+1

이 대답은 사실이지만, 질문에 원래의 문제와 관련이 있다고는 생각하지 않습니다. –

2
public Point WorldToMapCell(Point worldPoint) 
{ 
    return WorldToMapCell(new Point((int)worldPoint.X, (int)worldPoint.Y)); 
} 

이 방법은 무한히 반복됩니다. (그것은 스스로를 반복하여 호출한다).

public Point WorldToMapCell(Point worldPoint) 
{ 
    return new Point((int)worldPoint.X, (int)worldPoint.Y); 
} 

당신은 호출 할 필요는 없다을 : 나는,이 방법은 케이스를 먹으 렴 경우는 다음과 같아야의 worldpoint 매개 변수의 공동 ords와 새 점을 반환해야합니다 무엇을 말할 수에서

메서드를 호출하는 대신 새로운 점을 직접 반환합니다.

관련 문제