【问题标题】:Cannot Get Pascal's Triangle Recursive Program to Work --Java无法让 Pascal 的三角递归程序工作——Java
【发布时间】:2015-08-07 17:04:54
【问题描述】:

我正在尝试为作业编写程序。要求是递归地创建 Pascal 的三角形,然后打印给定的行。但是,在编译我的程序后,我得到了几个 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)

有谁知道我做错了什么?我已经尝试了一切,尤其是改变条件,但没有任何效果。这是我的代码:

    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();
        }
    }   



}

【问题讨论】:

  • 为了将来参考,有时在代码中显示错误的行会很好,因为我们看不到行号。
  • 好的,我添加了 cmets 以显示第 79 行、第 86 行和第 93 行
  • 您的行似乎超出了界限。例如Row+1 = 10,但最大行数是 9。我只是在开头做一个简单的检查,看看该行是否会越界,如果是,就返回。

标签: java recursion multidimensional-array runtime-error pascals-triangle


【解决方案1】:

ArrayIndexOutOfoundsException 似乎即将到来,因为此行允许递归以无效的 row 索引继续。

else if (col >= pTriangle[row].length && row < pTriangle.length)

row 变量可以是pTriangle.length - 1,然后你调用populateT(row+1, col),将pTriangle.length 传递给递归调用。然后该递归调用最终会尝试访问无效的row 索引,从而导致异常。将其更改为row &lt; pTriangle.length - 1 将立即解决异常问题。

它上面的条件row &lt; pTriangle.length控制何时移动到下一列,但这里不需要它;您没有在此处修改row

此外,您会希望在匹配 row 时停止列递归,而不是在匹配 row 的物理结尾时停止列递归,因此两个条件都需要更改。将if (col &lt; pTriangle[row].length &amp;&amp; row &lt; pTriangle.length) 更改为if (col &lt; row),将else if (col &gt;= pTriangle[row].length &amp;&amp; row &lt; pTriangle.length) 更改为else if (col &gt;= row &amp;&amp; row &lt; pTriangle.length - 1)

在这些条件之上,需要在代码中进行类似的更改,以确定是编写1 还是添加上面行中的相关数字。将else if (row != 0 &amp;&amp; col == 0 || col == pTriangle[row].length-1) 更改为else if (row != 0 &amp;&amp; col == 0 || col == row) 并将else if(row &gt; 1 &amp;&amp; col != 0 &amp;&amp; col != pTriangle[row].length-1) 更改为else if(row &gt; 1 &amp;&amp; col != 0 &amp;&amp; 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)。

【讨论】:

  • 谢谢,这真的很有用。不知何故,我从来没有真正使用过 2D 数组,所以我认为这就是为什么我很难想象为什么我会超出数组范围的部分原因。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多