Форматирование треугольника Паскаля в Python

Я беру свой первый урок программирования и немного не понимаю, как закончить этот код. Я пытаюсь построить треугольник Паскаля с n строками. У меня есть строки для печати, каждая в отдельной строке, но у меня проблемы с форматированием их в треугольник. Ниже то, что у меня есть на данный момент. Заранее спасибо!

def print_pascal_triangle(n):
    # problem0_pascal.pascal_triangle(n) provides the rows in a list of lists         
    rows = problem0_pascal.pascal_triangle(n)


    # Now print the rows, one by one, CALLING  digits_in_biggest_number
    # and  print_row  as appropriate.
    for k in range(len(rows)):
        spaces = digits_in_biggest_number(rows[k])
        print_row(rows[k], spaces)

def digits_in_biggest_number(row):
    """
    Returns the number of digits in the biggest number in the
    given list of numbers.
    """

    largest = 0
    for k in range(len(row)):
        if row[k] > largest:
            largest = row[k]

    digits = int(math.log10(largest)) + 1
    return digits



def print_row(numbers, spaces_per_number):
    """
    Prints the numbers in the given list of numbers.
    Each number is printed using the given number of spaces, except
    for the first number (1) which is printed with a single space.
    """
    line = ''
    for k in range(len(numbers)):
        line += str(numbers[k]) + (spaces_per_number * ' ')

    print(line)

person JShell    schedule 12.10.2013    source источник
comment
Возможно, вам стоит взглянуть на это: stackoverflow.com/questions/1242073/   -  person multigoodverse    schedule 13.10.2013


Ответы (1)


Поскольку вы пытаетесь учиться, я не дам вам решения, но сделаю несколько предложений ...

В print_row подумайте, какова ваша цель. У вас есть строка документации, в которой говорится, что вы печатаете число «с заданным количеством пробелов». Это то, что вы хотите?

Подумай об этом. Вы хотите это:

        1
       1 1
      1 2 1
     1 3 3 1
      ...

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

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

Например, вы можете ввести свои функции, а затем ввести:

print_row([1, 2, 1], 10)

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

Более продвинутый метод, BTW, - это разработка через тестирование, при которой вы пишете тесты, которые вызывают функции и проверяют, что они делают то, что от них ожидается. Если вы хотите узнать об этом больше, Google на TDD и Python для некоторой интересной информации о кодировании.

person pcm    schedule 12.10.2013
comment
Это двинуло меня в правильное русло, спасибо! К сожалению, я либо неправильно вас понял, либо это работает только для нескольких строк. Когда я вызываю print_pascal_triangle (20), левый край выравнивается, но правый очень неровный - person JShell; 13.10.2013
comment
Некоторые моменты ... 1) вы можете распечатать уровень отступа для каждой строки, чтобы убедиться, что это то, что вы хотите, 2) ключ - это общая длина строки, а не количество цифр в каждом номере, при определении отступ, и 3) print_row был просто примером того, как ввести строку и вызвать функцию для ее проверки. Вероятно, вы не захотите передавать второй аргумент. - person pcm; 14.10.2013