0

私は再帰的な Java プログラムで問題を抱えています。現在の問題は、ベースの case1 if が実行されている理由がわからないことです。findPath への最初のメソッド呼び出しでは、値 2 と 0 が渡されます。exitRow = 4 and cols-1 = 11. したがって、私の理解では、maze[][] の 2 つの場所が同じではないため (maze[4][11] ! =迷路[2][0])。しかし、それはまさにそれがしていることです。if 構造の理解で明らかに何かを見逃しているか、他の場所でエラーがあり、助けていただければ幸いです。

注:私も試しました

if (row == exitRow && col == cols-1)

しかし、これによりスタックオーバーフローが発生しました。そして、それについて私が理解していることはほとんどありませんが、それは、私の再帰が私を基本ケースに近づけていないか、それが書かれているために基本ケースに到達できないことを意味します。私が使用してきたこのガイドhttp://www.cs.bu.edu/teaching/alg/maze/に基づいて、再帰が正しいと仮定しています。これは、基本ケースが問題であると私に信じさせます。

どうもありがとう。

private Boolean findPath(int row, int col)
{
    //base case 1
    if (maze[exitRow][cols-1]==maze[row][col])
    {
        System.out.println("test");//for debugging
        return true;
    }
    //base case 2
    if (maze[row][col] == '#')
    {
        return false;
    }

        maze[row][col] = 'O';
        System.out.println("test1");//for debugging
        steps++;

        //check north
        if (findPath(row+1,col)==true )
        {
        return true;
        }
        //check east
        if (findPath(row,col+1)==true  )
        {
            System.out.println("test2");
        return true;
        }    
        //check south
         if (findPath(row-1,col)== true)
        {
        return true;
        } 
        //check west 
        if (findPath(row,col-1)== true)
        {
        return true;
        }

        System.out.println(steps);
        maze[row][col] = '.';//unmark location

    return false;
}
4

1 に答える 1

0
if( maze[exitRow][cols-1]==maze[row][col] )

現在のタイルが出口タイルと同じタイプの場合、true を返します。始点も終点も床(.)なので、関数はすぐに戻ります。これに固執します:

if (row == exitRow && col == cols-1)

出口を見つけたかどうかを確認するのは正しいテストです。オーバーフローについては次のとおりです。

入力したタイルを としてマークしますがO、マークが存在するかどうかをテストすることはありません。すでに壁 ( if (maze[row][col] == '#')) をテストしているため、次のいずれかをテストします。

  • マークのないフロア以外:if (maze[row][col] != '.')
  • 壁またはマーク:if (maze[row][col] == '#' || maze[row][col] == 'O')

効果は同じであるため、両方のケースを同じように扱うことができることに注意してください-そこに行かないでください。

于 2012-11-15T05:47:11.283 に答える