2012-09-24 2 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); 

Для того, чтобы рекурсия работать, факторный метод подходит базовый случай, когда х = 0. В вашем методе, вы делаете не шаги к базовому случаю, и, таким образом, ваш метод будет продолжать называть себя навсегда.

+1

Хотя этот ответ верен, я не думаю, что он вообще связан с исходной проблемой в вопросе. –

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

Этот метод будет терпеть бесконечно. (Он называет себя снова и снова).

Из того, что я могу сказать, этот метод должен возвращать новую точку с сопредседателями ords параметра worldpoint, если тот случай, он должен выглядеть следующим образом:

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

Вам не нужно звонить метод, но вместо этого просто прямо возвращаем новую точку.

 Смежные вопросы

  • Нет связанных вопросов^_^