Pascal三角形Java的递归方法

时间:2013-11-18 02:37:28

标签: java recursion pascals-triangle

我编写了一个方法来评估n行的Pascal三角形。但是,当我测试方法时,我收到错误"线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:-1"。这是代码。

public static int[] PascalTriangle(int n)
{
    int[] pt = new int[n+1];
    if(n == 0)
    {
        pt[0] = 1;
        return pt;
    }
    int[] ppt = PascalTriangle(n-1);
    pt[0] = pt[n] = 1;
    for(int i = 0; i < ppt.length; i++)
    {
        pt[i] = ppt[i-1] + ppt[i];
    }
    return pt;
}

如果您对如何编辑代码以解决问题有任何想法,请与我们联系。

5 个答案:

答案 0 :(得分:4)

for(int i = 0; i < ppt.length; i++)
    {
        pt[i] = ppt[i-1] + ppt[i];

在您的第一次迭代中,i == 0以及(i-1) == -1。这是错误的原因。

您可以特殊处理边界以避免这种情况。或者正如其他人所建议的那样,从1开始i而不是0。

答案 1 :(得分:0)

在此代码中:

pt[0] = pt[n] = 1;
for(int i = 0; i < ppt.length; i++)
{
    pt[i] = ppt[i-1] + ppt[i];
}

问题是当i为0时,您正试图访问ppt[i-1] ppt[-1]。需要注意的是,当i为0时,您不需要执行设置pt[i]的语句,因为您已经在循环之前设置了pt[0]!尝试将i初始化为1而不是0。

答案 2 :(得分:0)

以下是我的一位朋友提出的一些代码

future.get()

快乐的复发!

答案 3 :(得分:0)

使用动态编程改善@Clemson代码:

class Solution {
    int[][] dp ; 
    public List<List<Integer>> generate(int numRows) {
        dp = new int[numRows][numRows];

        List<List<Integer>> results = new ArrayList<>();
        pascal(results, numRows);

        return results;
    }

    private void pascal(List<List<Integer>> results, int numRows) {
        for(int i = 0; i < numRows; i++) {
            List<Integer> list = new ArrayList<>();
            for(int j = 0; j <= i ; j++) {
                list.add(dfs(i, j));
            }
            results.add(list);
        }
    }

    private int dfs(int i, int j) {
        if(j == 0 || i == j) return 1;

        if(dp[i][j] != 0) return dp[i][j];

        return dp[i][j] = dfs(i - 1, j - 1) + dfs(i - 1, j );
    }

}

答案 4 :(得分:0)

这不是代码的解决方案,但它是仅使用递归打印Pascals Triangle的解决方案,这意味着使用组合公式不会产生循环。它所需要的只是一个主方法或演示类,以创建PascalsTriangle类的实例。希望这对将来的Java学生有帮助。

public class PascalsTriangle {

private StringBuilder str; // StringBuilder to display triangle

/**
 * Starts the process of printing the Pascals Triangle
 * @param rows Number of rows to print
 */
public PascalsTriangle(int rows) {

    str = new StringBuilder();

    printTriangle(rows, str);
}

/**
 * Uses recursion to function as an "outer loop" and calls
 * itself once for each row in triangle. Then displays the result
 * @param row The number of the row to generate
 * @param str StringBuilder to insert each row into
 */
public static void printTriangle(int row, StringBuilder str) {

    // calls itself until row equals -1
    if (row >= 0) {

        // calls lower function to generate row and inserts the result into front of StringBuilder
        str.insert(0, getRow(row, 0) + "\n");

        // calls itself with a decremented row number
        printTriangle(row - 1, str);
    } else {

        // when the base case is reached - display the result
        JOptionPane.showMessageDialog(null, str);
        System.exit(0);
    }
}

/**
 * Uses recursion to act as the "inner loop" and calculate each number in the given row
 * @param rowNumber Number of the row being generated
 * @param elementNumber Number of the element within the row (always starts with 0)
 * @return String containing full row of numbers or empty string when base case is reached
 */
public static String getRow(int rowNumber, int elementNumber) {

    // calls itself until elementNumber is greater than rowNumber
    if (elementNumber <= rowNumber) {

        // calculates element using combinations formula: n!/r!(n-r)!
        int element = fact(rowNumber) / (fact(elementNumber) * (fact(rowNumber - elementNumber)));

        // calls itself for each element in row and returns full String            
        return element + " " + getRow(rowNumber, elementNumber + 1);

    } else return "";
}

/**
 * Helper function that uses recursion to calculate factorial of given integer
 * @param n Number to calculate factorial
 * @return Factorial
 */
public static int fact(int n) {
    if (n <= 0)
        return 1;
    else
        return n * fact(n - 1);
}