2015-08-07 3 views
0

Я работаю над программой для назначения Java, где мне нужно использовать рекурсию для заполнения треугольника Паскаля, а затем напечатать данную строку треугольника.Проблема с ArrayIndexOutOfBounds в программе треугольника Паскаля

Все компилируется нормально, но у меня возникают проблемы с исключением ArrayIndexOutOfBound.

Трассировка стека в основной (строка 30) в классе pTTest идет из строки 80, 87, 92 of pasTriangle в методе populateT. Поэтому, очевидно, что-то здесь не так. Кто-нибудь знает, что здесь не так? Пожалуйста, смотрите мой код ниже:

//******************************************************************************************************************************************************************************************* 
// pasTriangleTest.java 
// 
// 
// Tests the pasTriangle class by creating a few Pascal's Triangles of different size as pasTriangle objects. Then calls the getLine method of pasTriangle class to print some of the lines 
// of the triangles. Tests include printing lines in the triangle, as well as trying to print the first line and non-existent lines of some triangles. 
// Anticipated exception (ArrayIndexOutOfBounds exception), occurring if line (row) outside of array is attempted to be accesed, is handled. 
// 
// 
// 
//******************************************************************************************************************************************************************************************* 


public class pTTest 


{ 

    public static void main (String [] args) 
    { 



     pasTriangle T1 = new pasTriangle(1); 
     pasTriangle T2 = new pasTriangle(9); 
     pasTriangle T3 = new pasTriangle(3); 
     pasTriangle T4 = new pasTriangle(5);   //Triangle with only one line created (so not a triangle); test for condition size == 1. 

     T1.populateT(0, 0); 
     T2.populateT(0, 0); 
     T3.populateT(0, 0); 
     T4.populateT(0, 0); 



     T1.getLine(1); 
     T2.getLine(4); 
     T2.getLine(9);     //Test for last line. 
     T3.getLine(1);     //Test for first line. 
     T3.getLine(2); 
     T4.getLine(1);     //Test for first line. 


    } 



} 

//******************************************************************************************************************************************************************************************* 
// pasTriangle.java 
// 
// 
// Represents Pascals's triangle. Determines the values on any given line of the triangle, given that each value on the inside of the triangle is the sum of the two values above it. 
// 
// Constructor recursively creates a Pascal's triangle given a certain size (number of lines the triangle contains). 
// 
// 
//******************************************************************************************************************************************************************************************* 

public class pasTriangle 
{ 

    private int size, row, col;               //Represents the number of lines the triangle has. 

    private int [][] pTriangle;             //2-D array to hold int values of triangle 





    /* **************************************************************************************************************************************************** 

      Constructor creates a 2D array to hold the Pascales triangle. Note the number of numbers on each line is the same as the number of lines in 
      the triangle, so size can be used for both values. Calls populateT method to populate the triangle. 

     ***************************************************************************************************************************************************/ 



    public pasTriangle(int size) 
    { 
     this.size = size; 

     pTriangle = new int[size][size]; 


    }  


     /* **************************************************************************************************************************************************** 

      Method which populates the Pascal's Triangle recursively. Note case where size = 1, recursion does not occur since only 1 integer can be added 
      to array. 
      Also note base case where base of triangle is reached and recursion stops. 
      Also note cases for first and last value of each line (row). 

      Appropriate values added to each index according to conditions. 


     *********************************************************************************************************************************************************/ 
    public void populateT(int row, int col) 
    { 


     if(size == 1) 
     { 
      pTriangle[0][0] = 1; 
     } 


     else if(size > 1) 
     { 
      if (col==0 && row == 0)                //First value.  
      { 
       pTriangle[row][col] = 1; 
      } 


      else if (col == 0 || col == pTriangle[row].length-1) 
      { 
       pTriangle [row][col] = 1;              //1 Set for first value in each line and last value in each line. 

      } 

      else if(row > 1 && col != pTriangle[row].length-1)      //Values in between first and last calculated from the two above them, to left and right. 
      { 
       pTriangle[row][col] = (pTriangle[row-1][col-1]) + (pTriangle[row-1][col+1]); 

      } 


      if (col < pTriangle[row].length) //Move over and give values to indexes recursively until end of row is reached 
      { 
       populateT(row, col+1);   //Recursive call here. 

      } 

      else if (col >= pTriangle[row].length && row < pTriangle.length) //If end of row is reached and number of rows is not exceeded. 
      { 
       col = 0;          //Col reset. 
       populateT(row+1, col);       //Move to next row as long as base of triangle is not exceeded, recursive call again here. 
      } 


     } 


    } 



    /* *********************************************************************************************************************************************** 

      Prints a string containing the values on a given line of the pasTriangle. Note 1 is subtracted from lineNumber to get correct index. 

     ***********************************************************************************************************************************************/ 


    public String getLine(int lineNumber) 
    { 
     lineNumber = lineNumber - 1; 
     String result = ""; 

     for(int biz = 0; biz < pTriangle[lineNumber].length; biz++) 
     { 
      result += Integer.toString(pTriangle[lineNumber][biz]); 

     } 

     System.out.println(result+"/n"); 

     return result; 

    } 

} 
+0

Можете ли вы включить трассировку стека для своего исключения в вопросе. – dave

+0

Здесь мы идем: Исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: 10 в pasTriangle.populateT (pasTriangle.java:79) pasTriangle.populateT (pasTriangle.java:86) в pasTriangle.populateT (pasTriangle.java:86) в pasTriangle.populateT (pasTriangle.java:86) в pasTriangle.populateT (pasTriangle.java:86) в pasTriangle.populateT (pasTriangle.java:92) pasTriangle.populateT (pasTriangle.java:86) в pasTriangle.populateT (pasTriangle. java: 86) pasTriangle.populateT (pasTriangle.java:86) в pTTest.main (pTTest.java:30) –

+0

Есть еще несколько случаев того же исключения в 86. –

ответ

0

Я думаю, я знаю ответ.

я обнаружил, что, скорее всего, else пропущена в else if цепи во фрагменте кода:

... else if(row > 1 && col != pTriangle[row].length-1)      //Values in between first and last calculated from the two above them, to left and right. 
      { 
       pTriangle[row][col] = (pTriangle[row-1][col-1]) + (pTriangle[row-1][col+1]); 

      } 

// else missing 
=========> if (col < pTriangle[row].length) //Move over and give values to indexes recursively until end of row is reached 
      { 
       populateT(row, col+1);   //Recursive call here. 

      } ... 

Я вставил else, программа успешно запущен и печатает следующее:

1/n 
000000000/n 
000000000/n 
100/n 
000/n 
10000/n 

Надеюсь, это поможет.

+0

Похоже, что это дублированный вопрос [ссылка] (http://stackoverflow.com/questions/31883108/cannot-get-pascals-triangle-recursive-program-to-work-java) –