Треугольник Паскаля в Java

Начинающий Java здесь! В рамках практики программирования я столкнулся с треугольником Паскаля. Я попытался реализовать решение, в котором треугольник печатается так:

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

Так что примерно правосторонний. Однако мое решение сталкивается с несколькими ошибками, и хотя я был бы признателен за помощь в этом, я прежде всего хотел бы знать, правильно ли я думаю о своем решении. (Для некоторых функций я использую пользовательскую библиотеку)

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

person Quant    schedule 16.06.2020    source источник


Ответы (1)


Вы были на правильном пути. Вот как я это реализовал:

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

Ваша часть else была правильной, но вы не проверили, равно ли j 0 до этого. Вместо установки текущего элемента в 1, когда i было равно 0 или когда i равнялось j, вы должны были сделать это, когда j равнялось 0 или когда i равнялось j. Из-за этой ошибки в более поздних строках, где i было не 0, а j было, вы попытались получить доступ к array[i - 1][j - 1], что в основном было array[i - 1][-1], что привело к ошибке IndexOutOfBoundsException.

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

Кроме того, это не было ошибкой, но вы сделали else if (i!=0 && i==j) Часть i != 0 не нужна, потому что вы ранее проверили, если i == 0.

Ссылка на repl.it

person user    schedule 16.06.2020
comment
Спасибо! Теперь я вижу, что то, что вы описываете, было именно моей проблемой. Конечным результатом был треугольник, в котором первый столбец состоял из единиц, а все остальные столбцы — из нулей. Еще один вопрос: что означает array[i] = new int[i + 1]; делать с массивом точно? - person Quant; 16.06.2020
comment
new int[i + 1] — это новый массив целых чисел длины i + 1 (то есть длина 1 для первого уровня, длина 2 для второго и т. д.). Затем он устанавливает этот новый массив как ith элемент array @Quant. - person user; 16.06.2020