[英]Recursive method causes java.lang.StackOverflowError
我正在嘗試創建Pascal的Triangle,並創建“ return pascalTriangle(row-1,col-1)+ pascalTriangle(row-1,col);”行。 在返回帕斯卡三角形中的int值的遞歸方法中,導致線程“ main” java.lang.StackOverflowError中的異常。 它只打印一行“ 1”,然后對其他行拋出異常。 我需要修復什么,使其不會引發任何異常並形成帕斯卡的三角形? 這是我的代碼:
import java.util.Scanner;
/**
* This program takes n input from the user, and forms Pascal's Triangle in n number of rows that the user entered.
*/
public class DD_PascalsTriangle {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("Enter an integer: ");
int n = scanner.nextInt(); //the number of rows created in the Pascal's Triangle
printTriangle(n); //print Pascal's Triangle
}
/**
*
* @param row rows in Pascal's Triangle
* @param col columns in Pascal's Triangle
* @return values in the Pascal's Triangle
*/
private static int pascalTriangle(int row, int col) {
if (col==0 || col==row) return 1; //base case
else return pascalTriangle(row - 1, col - 1) + pascalTriangle(row - 1, col); //create the values in Pascal's Triangle
}
/**
*
* @param n the input from the user (aka the n number of rows in Pascal's Triangle)
*/
private static void printTriangle(int n){
for (int row=0; row<n; row++){
for (int col=0; col<n;col++){
System.out.println(pascalTriangle(row,col) + " ");
}
System.out.println();
}
}
}
似乎您的代碼將進入無限循環,因為您為內部循環保留了錯誤的條件,哪個調用和調用......填充堆棧內存多於JVM分配的內存
為了避免這種堆積溢出錯誤和帕斯卡三角形的完美形狀,您只需添加一個額外的循環並更改內部循環的條件即可。
public static void printTriangle(int n){for(int row = 0; row <n; row ++){
//Added Spacer loop for getting perfect shape for pascal triangle
for(int spacer =n ; spacer > row ; spacer--){
System.out.print(" ");
}
for (int col=0; col <= row; col++){
System.out.print(pascalTriangle(row,col) + " ");
}
System.out.println();
}
更改第二個循環以迭代到上一行而不是n。
public static void printTriangle(int n){
for (int row = 0; row < n; row++) {
for (int col=0; col <= row; col++){
System.out.print(pascalTriangle(row,col) + " ");
}
System.out.println();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.