Рекурсивный метод вызывает java.lang.StackOverflowError - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать треугольник Паскаля, и строка «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();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Кажется, ваш код работает в бесконечном цикле. Какие вызовы и вызовы ...... заполняют стек стека больше, чем выделено JVM

Чтобы избежать этой ошибки переполнения стека и идеальной формы для вашего треугольника Паскаля, вы можете просто добавить один дополнительный цикл и изменить условие для внутреннего цикла.

public static void printTriangle (int n) { for (int row = 0; 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();
   }
0 голосов
/ 27 марта 2019

Измените второй цикл для повторения до строки, а не 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();
       }
...