Вложенный-l oop нечетный шаблон в Python - PullRequest
0 голосов
/ 30 марта 2020

Я хочу сделать шаблон, как показано ниже:

N = 1
*

N = 3
  *
***
  *

N = 5
    *
  ***
*****
  ***
    *

и так далее ...

Тем не менее, я пишу, что эта программа работает только для N = 5. Может кто-нибудь пожалуйста объясните в чем ошибка и в чем ее решение? Спасибо.

N = int(input())
k = 1
for i in range(1, N - 1):
    for j in range(1, N + 1):
        if(j <= N - k):
            print(' ', end = '')
        else:
            print('*', end = '')
    k = k + 2
    print()

k = 2
for i in range(1, N - 2):
    for j in range(1, N + 1):
        if(j >= N - k):
            print('*', end = '')
        else:
            print(' ', end = '')
    k = k - 2
    print()

Ответы [ 2 ]

1 голос
/ 30 марта 2020

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

Теперь рассмотрим сумму for i in range(1, N - 1) и for i in range(1, N - 2) с некоторым большим N. Например, N = 99:

len(range(1, 99 - 1)) + len(range(1, 99 - 2))
>>> 193

Это ваша первая ошибка. Функция работает только с N = 5 из-за двух минусов, которые вы выбрали для своих диапазонов. Здесь вам нужно переписать вашу математику:

len(range((99+1)//2)) + len(range((99-1)//2))
>>> 99

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

Вторая ошибка, которую вы имеете, связана с тем, как вы печатаете нижнюю половину треугольника. По сути, вы пытались перевернуть все, чтобы напечатать все в обратном порядке, но это каким-то образом сломало логику c. Здесь мы хотим напечатать k пустых мест для каждой строки, увеличивая k на два для каждой строки.

Функция с минимальными исправлениями:

N = int(input())
k = 1
for i in range((N+1)//2):
    for j in range(1, N + 1):
        if(j <= N - k):
            print(' ', end = '')
        else:
            print('*', end = '')
    k = k + 2
    print()

k = 2
for i in range((N-1)//2):
    for j in range(1, N + 1):
        if(j > k):
            print('*', end = '')
        else:
            print(' ', end = '')
    k = k + 2
    print()
0 голосов
/ 30 марта 2020

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

N = 5

def print_pyramid(n):
    for i in [min(2*i+1, 2*n-2*i-1) for i in range(n)]:
        print((" " * (n-i)) + ("*" * i))

k = 1
while k <= N:
    print("N = " + str(k))
    print_pyramid(k)
    print("")
    k += 2
...