1

コードでスタック オーバーフローによる無限再帰の問題が発生していることはわかっています。私はそれを修正する方法がわからないだけです。助けていただければ幸いです。

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));
}
4

3 に答える 3

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

このメソッドは、それ自体を無限に再帰します。(それは何度も何度も自分自身を呼び出します)。

私が知る限り、このメソッドは worldpoint パラメーターの座標を持つ新しいポイントを返す必要があります。その場合、次のようになります。

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

メソッドを呼び出す必要はありませんが、新しいポイントを直接返すだけです。

于 2012-09-25T00:41:45.003 に答える
2

無限再帰 (およびその結果のスタック オーバーフロー) は、直接的または間接的に自分自身を繰り返し呼び出す関数があり、それを停止する機会がない場合に発生します。最初の関数はWorldToMapCell無条件に自分自身を呼び出し、この問題を引き起こしています。

于 2012-09-25T00:01:12.600 に答える
2

再帰が機能するには、メソッドに基本ケースが必要です。そうしないと、自分自身を呼び出す無限ループに陥ります。

数値の階乗を計算する場合を考えてみましょう:

public int factorial(int x) {
    if (x == 0)
        return 1;
    else 
        return x * factorial(x - 1);

再帰が機能するために、階乗法は x = 0 である基本ケースに近づきます。この方法では、基本ケースに向かって何のステップも行わないため、メソッドは自分自身を永遠に呼び出し続けます。

于 2012-09-25T00:05:29.060 に答える