2

Java beginner here! As part of practicing programming, I've run into Pascal's triangle. I tried to implement a solution where the triangle is printed like so:

1
1 1 
1 2 1
1 3 3 1 
1 4 6 4 1
...

So roughly right-sided. My solution though runs into multiple errors, and although I would appreciate help with that, I would primarily like to know if I am thinking correctly with my solution. (For some functions I am using a custom library)

public static void main(String[] args) {
    int input = readInt("Enter triangle size, n = ");
    array = new int[input][input];

    for (int i = 0; i < input; i++) { // rows
        for (int j = 0; j < i + 1; j++) { // columns
            if (i = 0) {
                array[i][0] = 1;
            } else if (i != 0 && i == j) {
                array[i][j] = 1;
            } else {
                array[i][j] = array[i - 1][j] + array[i - 1][j - 1];
            }
        }
    }
    // print out only the lower triangle of the matrix
    for (int i = 0; i < input; i++) {
        for (int j = 0; j < input; j++) {
            if (i <= j) {
                System.out.println("%d ", array[i][j]);
            }
        }
    }
}
Community
  • 1
  • 1
Quant
  • 181
  • 1
  • 9

1 Answers1

1

You were on the right track. Here's how I implemented it:

Scanner sc = new Scanner(System.in);
System.out.print("Enter triangle size, n = ");
int n = sc.nextInt();
sc.close();
//This will be a jagged array
int[][] array = new int[n][0];

for (int i = 0; i < n; i++) {
  //Add the next level (it's empty at the start)
  array[i] = new int[i + 1];
  for (int j = 0; j <= i; j++) {
    //At the ends, it's just 1
    if (j == 0 || j == i) {
      array[i][j] = 1;
    } else { //The middle
      array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
    }
  }
}

for (int i = 0; i < n; i ++) {
  for (int j = 0; j <= i; j++) {
    //printf is what you use to do formatting
    System.out.printf("%d ", array[i][j]);
  }
  //Without this, everything's on the same line
  System.out.println();
}

Your else part was correct, but you didn't check if j equaled 0 before that. Instead of setting the current element to 1 when i was 0 or when i equaled j, you should have done it when j was 0 or when i equaled j. Because of this mistake, in later rows where i was not 0, but j was, you tried to access array[i - 1][j - 1], which was basically array[i - 1][-1], causing an IndexOutOfBoundsException.

I also made a jagged array instead of an even matrix because it made more sense that way, but it shouldn't matter much.

Also, this wasn't an error, but you did else if (i!=0 && i==j) The i != 0 part is unnecessary because you checked previously if i == 0.

Link to repl.it

user
  • 7,435
  • 3
  • 14
  • 44
  • Thank you! I see now that what you describe was exactly my problem. The end result was a triangle with the first column made of 1s and all other columns of 0s. One more question: what does array[i] = new int[i + 1]; do to the array exactly? – Quant Jun 16 '20 at 15:00
  • 1
    `new int[i + 1]` is a new array of ints of length `i + 1` (so it's length 1 for the first level, length 2 for the second, and so on). Then it sets that new array to be the `i`th element of `array` @Quant – user Jun 16 '20 at 15:01