Нет, на самом деле не существует способа сделать это с одним циклом, поскольку задача включает в себя двойной цикл, но вы можете сделать его более эффективным, например, использовать понимание списка для построения каждой строки, чтобы вы вызывали только print
один раз в строке.
Вы могли бы использовать рекурсию, но это менее эффективно, и это на самом деле не устраняет цикл, оно просто реализует его по-другому.
Вот списоккомп версия вашего кода, обернутая в функцию.
def show_pattern(n):
for i in range(n, 0, -1):
print(''.join([str(j)*i for j in range(n, 0, -1)]))
FWIW, вот версия с одной строкой, которая несколько более эффективна, но, конечно, временная сложность все еще O (n²).И я думаю, вы согласитесь, что это немного сложнее читать.;)
print('\n'.join([''.join([str(j)*i for j in range(n, 0, -1)]) for i in range(n, 0, -1)]))
Можно утверждать, что сложность на самом деле O (n³), поскольку str(j)*i
выполняется внутри цикла, но этот цикл работает на скорости C, поэтому мы можем притвориться, что этопримитивная операция.