рекурсия треугольника Паскаля

Мне нужно написать Java-код, который печатает паскальский треугольник. Это то, чем я занимался до сих пор.

import java.util.Scanner;

class Pascal {

    static int bnk (int n, int k) {

        if (k==0 || k==n) {
            return 1;
        } // B(n,k) Berechnung für Standardwert = 1;
        else {
            int x = (bnk(n-1, k-1) + bnk(n-1, k));
            return x;
        } // Berechnung aller sonstigen B(n,k)-Werte. 
    } // Berechnung von B(n,k)

    public static void main (String [] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("How many rows?: ");
        int r = sc.nextInt();

        sc.close();

        for (int n=0; n<r; n++) {

            for (int j=0; j<(r-n); j++) {
                System.out.print(" "); 
            } // Setzt Anzahl Leerzeichen vor erster Zahl

            for (int k=0; k<=n; k++) {

                int b = bnk(n,k);
                System.out.print(b+" ");
            } // Berechnet in jeder Reihe alle Elemente

            System.out.println();
        } // Berechnet Reihe nach Reihe
    } // main
} // class Pascal

Первый метод вычисляет значения, необходимые в треугольнике. Второй печатает строку треугольника за строкой, печатая (r-n) пробелы. n обозначает текущую строку, а r - общее количество строк. Таким образом, левая сторона треугольника печатается правильно, но проблема в том, что когда значения в треугольнике становятся слишком высокими, треугольник теряет форму на правой стороне. Надеюсь, то, что я описал, было понятно. Не могли бы вы помочь мне найти способ правильно отформатировать треугольник?

Текущий вывод выглядит так:

5 рядов: https://gyazo.com/d9a536d3ac92c155707ebb2e4ee7745b

введите описание изображения здесь

10 рядов: https://gyazo.com/4ab0479f9324dd7c2911398ea5a71e33

введите описание изображения здесь


person Tim Buchholz    schedule 16.12.2016    source источник
comment
Возможно, вы могли бы добавить к своему вопросу свой текущий результат (для иллюстрации)   -  person    schedule 16.12.2016
comment
Я попытался добавить вывод, но это не позволило мне правильно его отредактировать для OP. В любом случае, проблема в том, что вы не освобождаете место для многозначных чисел в своем треугольнике. Вы должны поставить больше пробелов между числами, и я подозреваю, что это станет лучше.   -  person DejaVuSansMono    schedule 16.12.2016


Ответы (2)


Таким образом, вы можете форматировать с помощью "\t", но вместо использования 1 используйте 2. Тогда вы сможете размещать числа через каждые 1 или каждые 2 пробела, позволяя первому (верхнему) быть между вторыми 2, и повторять.

person ben    schedule 16.12.2016
comment
Не могли бы вы вкратце написать фрагмент кода, чтобы показать, что вы имеете в виду? Я все еще новичок в java, и я действительно не понимаю, что вы собираетесь делать. - person Tim Buchholz; 16.12.2016
comment
@TimBuchholz он имеет в виду, что вместо печати System.out.print(" "); используйте System.out.print("\t"); или System.out.print("\t\t");, где "\t" - escape-символ для табуляции - person Frakcool; 16.12.2016
comment
Я пробовал это, и это не работает так, как вы думаете. Это делает его прямоугольным треугольником вместо искомого Паскаля. Круто, но это не решает проблему. - person DejaVuSansMono; 16.12.2016

Простое решение:

Вычислите максимальное количество цифр, которые должны отображаться, в вашем случае 3 для 126. Затем каждое число отображается с использованием этого количества места с начальными или конечными пробелами, чтобы заполнить его.

Более сложное решение, которое может быть не лучше, в зависимости от вашего вкуса:

Дано n строк чисел для отображения

  1. Инициализируйте список Positions_n, в котором хранятся позиции, в которых должно отображаться каждое число в последней строке. В вашем примере последняя строка

1 9 36 84 126 126 84 36 9 1

Таким образом, для position_n будет установлено значение 0, 2, 4, 7, 10, 14, 18, 21, 24, 26 (если я не ошибся)

  1. Итерируя в обратном направлении, сгенерируйте позиции_i-1 из позиций_i, взяв среднее значение двух позиций. В примере с позициями_n, position_n-1 будет таким образом (при условии округления в большую сторону):

1, 3, 6, 12, 16, 20, 23, 25

  1. Отобразите числа на этих позициях.

Проблема с этим, конечно, в том, что у нас будут прыжки, которые могут выглядеть плохо, когда нам нужно округлить. Кроме того, интервалы между числами могут быть странными и неравномерными.

person Aziuth    schedule 16.12.2016