0

ラベルのグリッド (サイズ n*n) があり、その不規則な部分を色で塗りつぶしたいと考えています。メソッドを書きました

private void fill(int j){

    while(board[j].getName().equals("s")){
       board[j].setBackground(Color.yellow);

       try{
            fill(j-1);   
        } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j+1);     
       } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j+n);  
            } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j-n);   
            } catch (ArrayIndexOutOfBoundsException e){}

    }
}

そして、私はまだStackOverflowErrorを取得しています。私は大きな部品を使用していません (私の n は最大 20 です)。while を if に置き換えようとしましたが、うまくいきませんでした。スタックには大きすぎますか、それとも無限ループになる可能性がありますか? どうすれば修正できますか?

4

2 に答える 2

1

なんらかの理由でそれを言ってみましょう

  • j遺言書のj-1条件whileが満たされ、
  • j-2notのような残りの値

したがって、fill(j)プログラムを呼び出すと、

  1. (pass)のテストwhile条件j

  2. whileループに入る

  3. setBackground為にj

  4. 呼び出すfill(j-1);

    プログラムが を呼び出す前にfill(j+1)、プログラムを終了する必要がfill(j-1)あるため、制御の流れはfill(j-1)レベルに移動し、プログラムは

    1. (pass)のテストwhile条件j-1

    2. whileループに入ります

    3. setBackground為にj-1

    4. fill((j-1)-1);つまり、呼び出しますfill(j-2)

      またfill((j-1)+1)、制御の流れが移動する前にfill(j-2)、プログラムは

      1. (不合格)のテストwhile条件j-2
      2. プログラムはループに入ることができないため、fill(j-2) から return を返します
    5. fill((j-1)+1)と同じである呼び出しfill(j)

したがって、アプリケーションは同じシナリオを繰り返そうとしますが、今回は異なるスタック レベルで、StackOverwlow につながります。


この状況を防ぐために、条件を変更して、すでにこの位置にいるかどうかもテストすることができます。

while(board[j].getName().equals("s") && board[j].getBackground() != Color.yellow)

に変更することもできます/変更whileする必要がありますif

于 2013-05-25T14:08:59.857 に答える
0

board[j].setName("bgSet")

board[j].setBackground(Color.yellow)

これで問題が解決する可能性があります。そうでない場合、while は常に true になります。

于 2013-05-25T13:36:15.960 に答える