Как бы я превратил это в треугольник вместо прямоугольного? - PullRequest
1 голос
/ 08 марта 2020

Мне нужен код для создания треугольника pascal. Этот код предназначен для прямоугольного треугольника, но мне нужно, чтобы он был Pascal треугольником. Он должен иметь 10 рядов и имеет разрыв в середине вершины и треугольника низа pascal. Может кто-нибудь, пожалуйста, помогите мне в этом. для петель будет хорошо. Спасибо!



    public static int get_pascal(int row, int col) {
        if (col == 0 || col == row) {
            return 1;
        } else {
            return get_pascal(row - 1, col - 1) + get_pascal(row - 1, col);
        }

    }

    public static void main(String[] args) {

        //row size variable
        int rowNum = 5;

        levels = new String[rowNum];

        int i = 0;
        int arIndex = 0;
        System.out.println(recurseRow(i, rowNum, arIndex));
        System.out.println("                                 ");
        System.out.println(upsideDown(rowNum-1));

    }

    //Recursion for row
    public static String recurseRow(int i, int rowNum, int arrayIndex) {
        if( i == rowNum)
            return "";
        else {
            int k = 0;
            int next = i + 1;
            String str = recurseCol(i, k);
            levels[arrayIndex] = str;
            arrayIndex += 1;
            return  str + "\n" + recurseRow(next, rowNum, arrayIndex);
        }
    }

    //Recursion for column
    public static String recurseCol(int i, int k) {
        if(k > i)
            return "";
        else {
            int next = k + 1;
            return get_pascal(i, k) + " " + recurseCol(i, next);
        }
    }


    //upside down recursion
    public static String upsideDown(int index) {
        if(index < 0) {
            return "";
        }

        else {
            String str = levels[index];
            index -= 1;
            return str + "\n" + upsideDown(index);
        }
    }
}

1 Ответ

0 голосов
/ 08 марта 2020

Вы можете добавить префикс нескольких пробелов, где вы рекурсивно создаете строку: вместо

String str = recurseCol(i, k);

у вас будет

String str = "";
for (int spaces = 0; spaces < 2 * (rowNum - i - 1); spaces++) { 
  str += " ";
}
str += recurseCol(i, k);

Вам также нужно отформатировать все числа, чтобы такой же ширины внутри recurseCol, например теперь все числа будут иметь 3 цифры в ширину:

return String.format("%3d %s", get_pascal(i, k), recurseCol(i, next));

Полученный код измененных методов:

    //Recursion for row
    public static String recurseRow(int i, int rowNum, int arrayIndex) {
        if( i == rowNum)
            return "";
        else {
            int k = 0;
            int next = i + 1;
            String str = "";
            for (int spaces = 0; spaces < 2 * (rowNum - i - 1); spaces++) {
                    str += " ";
            }
            str += recurseCol(i, k);
            levels[arrayIndex] = str;
            arrayIndex += 1;
            return  str + "\n" + recurseRow(next, rowNum, arrayIndex);
        }
    }

    //Recursion for column
    public static String recurseCol(int i, int k) {
        if(k > i)
            return "";
        else {
            int next = k + 1;
            return String.format("%3d %s", get_pascal(i, k), recurseCol(i, next));
        }
    }

"magi c" числа 2 и 3 связаны друг с другом: если каждое число имеет n-разрядную ширину, то нам нужно добавить префикс в строку, состоящую из (n-1) пробелов, повторенных (rowNum - i - 1) раз.

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

...