2016-04-26 21 views
-1
void FireSimulator::spread() 
{ 
    int numberLoops; 
    if(x>y) 
     numberLoops=x; 
    else 
     numberLoops=y; 

    for(int k=0; k<=numberLoops+1; k++) 
    { 
     for(int i=1; i<x-1; i++) 
     { 
      for(int j=1; j<y-1; j++) 
      { 
       if((forest[i][j].getState()==2) && (forest[i][j+1].getState()==1)) 
        { 
         forest[i][j+1]=2; 
         Print(); 
        } 

       if((forest[i][j].getState()==2) && (forest[i+1][j].getState()==1)) 
        { 
         forest[i+1][j]=2; 
         Print(); 
        } 

       if((forest[i][j].getState()==2) && (forest[i][j-1].getState()==1)) 
        { 
         forest[i][j-1]=2; 
         Print(); 
        } 

       if((forest[i][j].getState()==2) && (forest[i-1][j].getState()==1)) 
        { 
         forest[i-1][j]=2; 
         Print(); 
        }   
      } 
    } } 
} 

FireSimulatorクラスは、火の広がりをシミュレートします。 A 2は書き込みツリーを表し、1はツリーを表し、0は空のスポットを表します。この機能は、現在のセルの近傍をチェックします。木が燃えていて、その隣に木があると、隣の木が燃えてしまいます。フォレスト(配列)内のすべてのセルをチェックする必要があります。私は3つのループでそれをしましたが、どのように再帰でそれを行うのですか?ループを再帰的に変換するには?

+0

確認するx/y座標を受け入れる関数を考えてみましょう。指示されたセルをチェックし、隣人の座標とこの同じ機能を呼び出す。 – kicken

答えて

1

ループとまったく同じロジックを取得する場合は、各ループを再帰関数に置き換える必要があります。次に、ループ変数の代わりに関数のパラメータがあります。そして、各関数の再帰終了条件をチェックすることを忘れないでください。私は、再帰を使用してループを交換する迅速な解決を手早く:

void CheckCellForIgnition(int col,int row) { // col and row designate a cell to check for ignition 
    if (row < y - 1) { 
     if ((forest[col][row]].getState() == 2) && (forest[col][row + 1].getState() == 1)) 
     { 
      forest[col][row + 1] = 2; 
      Print(); 
     } 

     if ((forest[col][row].getState() == 2) && (forest[col + 1][row].getState() == 1)) 
     { 
      forest[col + 1][row] = 2; 
      Print(); 
     } 

     if ((forest[col][row].getState() == 2) && (forest[col][row - 1].getState() == 1)) 
     { 
      forest[col][row - 1] = 2; 
      Print(); 
     } 

     if ((forest[col][row].getState() == 2) && (forest[col - 1][row].getState() == 1)) 
     { 
      forest[col - 1][row] = 2; 
      Print(); 
     } 
     CheckCellForIgnition(col, row + 1); 
    } 
} 

void CheckColumnForIgnition(int col) { // col - column to check for ignition 
    if (col < x - 1) { 
     CheckCellForIgnition(col,1); 
     CheckColumnForIgnition(col + 1); 
    } 
} 

void IgniteIteration(int iterationsLeft) { // iterationsLeft - the number of iterations left to perform 
    if (iterationsLeft>0) { 
     CheckColumnForIgnition(1); 
     IgniteIteration(iterationsLeft - 1); 
    } 
} 

void spread() 
{ 
    IgniteIteration(max(x, y)); 
} 

実行ロジックは、あなたのループのコードとまったく同じでなければなりません。しかし、あなたの火の拡散ロジックがそれほど固定されていない場合は、別の方法で再帰を使用することを検討することができます。

関連する問題