问题描述
我正在尝试为作业编写程序。
要求是递归创建Pascal的Triangle,然后打印给定的行。
但是,在编译程序后,我得到了几个ArrayIndexOutOfBoundsExceptions。
这是堆栈跟踪: java.lang.ArrayIndexOutOfBoundsException: 10 at pasTriangle.populateT(pasTriangle.java:79) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:93) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java: 93) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)
java.lang.ArrayIndexOutOfBoundsException: 10 at pasTriangle.populateT(pasTriangle.java:79) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:93) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java: 93) at pasTriangle.populateT(pasTriangle.java:86) at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)at pasTriangle.populateT(pasTriangle.java:86)
有人知道我在做什么错吗? 我已经尝试了所有方法,尤其是改变调味品,但没有任何效果。 这是我的代码:
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 > 0 && size == 1 && row < size)
{
pTriangle[0][0] = 1;
}
else if(size > 1 && row < size)
{
if (col==0 && row == 0) //First value.
{
pTriangle[row][col] = 1;
}
else if (row != 0 && 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 != 0 && 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]);
//Line 79, exception here.
}
if (col < pTriangle[row].length && row < pTriangle.length) //Move over and give values to indexes recursively until end of row is reached
{ **//Line 87, exception here.**
populateT(row, col+1);
}
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.
**//Line 93 Exception here.**
populateT(row+1, col);
}
}
}
/* ***********************************************************************************************************************************************
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;
}
}
{
public static void main (String [] args)
{
try{
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.
}
catch(ArrayIndexOutOfBoundsException exception)
{
exception.printStackTrace();
}
}
}
1楼
ArrayIndexOutOfoundsException
似乎即将到来,因为此行允许递归以无效的row
索引继续。
else if (col >= pTriangle[row].length && row < pTriangle.length)
该row
变量可以是pTriangle.length - 1
,然后调用populateT(row+1, col)
,将pTriangle.length
传递给递归调用。
然后,该递归调用最终尝试访问无效的row
索引,从而导致异常。
将其更改为row < pTriangle.length - 1
将解决直接异常问题。
直接在其上方的条件row < pTriangle.length
,控制何时移动到下一列,但是您在这里不需要它。
您没有在这里修改row
。
此外,你会想,当你匹配停止列递推row
,而不是当你的身体结束匹配row
,所以这两个条件需要改变。
将if (col < pTriangle[row].length && row < pTriangle.length)
更改为if (col < row)
, else if (col >= pTriangle[row].length && row < pTriangle.length)
更改为else if (col >= row && row < pTriangle.length - 1)
。
在这些条件之上,需要在代码中进行类似的更改,以确定是写1
还是添加上一行的相关数字。
将else if (row != 0 && col == 0 || col == pTriangle[row].length-1)
更改为else if (row != 0 && col == 0 || col == row)
else if(row > 1 && col != 0 && col != pTriangle[row].length-1)
到else if(row > 1 && col != 0 && col != row)
。
当您添加前一行的元素以写入非1
值时,似乎您添加的是错误的元素。
假设有效的数据结构如下所示...
[1][0][0][0]
[1][1][0][0]
[1][2][1][0]
[1][3][3][1]
您需要在上方和左侧添加元素,在上方直接添加元素。
更改(pTriangle[row-1][col-1]) + (pTriangle[row-1][col+1]);
到(pTriangle[row-1][col-1]) + (pTriangle[row-1][col]);
。
( col+1
更改为col
。)
如果您在getLine
更改输出代码以添加空格,则可以更好地验证数字。
同样, println
已经在参数之后打印了新行,因此您不需要附加换行符(用\\n
代替/n
)。