我编写了一个方法来评估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;
}
如果您对如何编辑代码以解决问题有任何想法,请与我们联系。
答案 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);
}