无法让帕斯卡的三角递归程序工作 --Java



我正在写一个作业程序。要求是递归地创建帕斯卡三角形,然后打印给定的行。然而,在编译我的程序之后,我得到了几个arrayindexoutofboundexcepeption。下面是堆栈跟踪: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();
        }
    }   

}

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)。

相关内容

  • 没有找到相关文章

最新更新