Search code examples
javaexceptionrecursionpascals-triangle

Recursive method causes java.lang.StackOverflowError


I am trying to create Pascal's Triangle, and the line:

return pascalTriangle(row-1, col-1) + pascalTriangle(row-1, col);

in the recursive method that returns int values in the Pascal's triangle, causes

Exception in thread "main" java.lang.StackOverflowError

It only prints one row 1, then throws exception for other rows. What do I need to fix so it doesn't throw any exception, and forms the Pascal's triangle? Here's my code:

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: ");
        // the number of rows created in the Pascal's Triangle
        int n = scanner.nextInt();
        // print Pascal's Triangle
        printTriangle(n);
    }

    /**
     * @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)
            // base case
            return 1;
        else
            // create the values in Pascal's Triangle
            return pascalTriangle(row-1, col-1) + pascalTriangle(row-1, col);
    }

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

Solution

  • It seems your code is going into an infinite loop as you have a wrong condition for the inner loop. The inner loop is iterating and filling up the stack memory, eventually exceeding the amount allocated by the JVM.

    In order to avoid this stack overflow error and and perfect the shape of your Pascal's Triangle you can simply add one extra loop and change the condition for the inner loop.

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