2

我正在研究康威的生命游戏计划。我打印了前两代细胞,但我无法再打印了。所以我决定使用递归,这样可以打印多批单元格。我的 NewCells 方法创建了第二代。我想如果我通过返回 NewCells(c) 而不是 c 来重复上述方法,它会打印出不同的结果,但它会一遍又一遍地打印出同一批单元格。

public class Life {

public static boolean[][] NewCells(boolean[][] c)
{
    int N = 5;
    int o=0;
    int p=0;
    int livecnt = 0; //keeps track of the alive cells surrounding cell
    int store = 0; //amount of surrounding cells for each individual cell
    int livestore[] = new int[N*N];


     System.out.println("Next Generation");
     // Checks for the amount of "*" surrounding (o,p)

      for (o=0; o < N; o++)
      { 
         for (p=0; p<N; p++)
         {
             for (int k=(o-1); k <= o+1; k++)
             {

                 for (int l =(p-1); l <=p+1; l++)
                 {
                     if ( k >= 0 && k < N && l >= 0 && l < N) //for the border indexes.
                     { 

                         if (!(k== o && l==p)) //so livecnt won't include the index being checked.
                         {
                             if (c[k][l] == true)
                             {
                                livecnt++;
                             }
                    }

                 }

                 }
             }
             livestore[store]= livecnt;
             livecnt = 0;
             store++;
         }
      }


      //Prints the next batch of cells
      int counter= 0;
      for (int i2 = 0; i2 <N; i2++)
      {
          for (int j2 = 0; j2 < N; j2++)
          {

          if (c[i2][j2] == false)
                 {
                     if (livestore[counter] ==3)
                     {
                        c[i2][j2]=true;
                         System.out.print("* ");
                     }
                     else
                    System.out.print("- ");
                 }

              else if (c[i2][j2] == true)
                 {
                     if (livestore[counter] ==1)
                     {
                        c[i2][j2]= false;
                        System.out.print("- ");
                     }
                     else if (livestore[counter] >3)
                     {
                         c[i2][j2]= false;
                         System.out.print("- ");
                     } 

                     else
                         System.out.print("* ");
                 }
                 counter++;
          }
          System.out.println();
      }

    return NewCell(c);  
}
/*************************************************************************************************************************************************/
public static void main(String[] args)
{
    int N = 5;
    boolean[][] b = new boolean[N][N];
    double cellmaker = Math.random();

    int i = 0;
    int j = 0;


    int o=0;
    int p=0;
    int livecnt = 0; //keeps track of the alive cells surrounding cell
    int store = 0; //amount of surrounding cells for each individual cell
    int livestore[] = new int[N*N];


     System.out.println("First Generation:");
     // Makes the first batch of cells
     for ( i = 0; i < N ; i++)
     {

         for ( j = 0; j< N; j++)
         {
              cellmaker = Math.random();


             if (cellmaker > 0.5) // * = alive; - = dead
             {
                 b[i][j]=true;

                 System.out.print( "* ");

             }


             if (cellmaker < 0.5)
            { b[i][j] = false;


             System.out.print("- ");

            }

         }
         System.out.println();

     }       


     boolean[][] newcells = new boolean[N][N];
     newcells = NewCells(b);

}

}
4

2 回答 2

1

我不认为递归对于这个应用程序是一个好主意。它会导致 StackOverflowError,因为每一代都会推送另一个调用堆栈帧。递归,正如这个程序使用的那样,与迭代相比没有优势。

相反,将对 NewCells 的 main 方法调用放在一个循环中。这样,无论堆栈大小如何,您都可以运行尽可能多的迭代。

于 2012-11-26T00:56:03.963 回答
1

您不是NewCell从内部调用NewCell,这就是递归的工作方式。

我假设这不是您的问题中的错字,而是对它是什么以及它是如何工作的缺乏了解,我建议阅读一些关于Java 中递归的内容。

了解基础知识后,请回到这里寻求更多帮助!

于 2012-11-26T00:01:11.097 回答