如何打印完整金字塔的金字塔?

How to print a pyramid of full pyramids?

我是一名新手程序员,我们最近的任务是打印一个完整的星号金字塔,行数基于输入,然后打印这些金字塔的金字塔。

基本上,当用户输入 Number of Rows: 4 时,我期望的输出是:

                     *
                    ***
                   *****
                  *******
               *     *     *
              ***   ***   ***
             ***** ***** *****
            *******************
         *     *     *     *     *
        ***   ***   ***   ***   ***
       ***** ***** ***** ***** *****
      *******************************
   *     *     *     *     *     *     *
  ***   ***   ***   ***   ***   ***   ***
 ***** ***** ***** ***** ***** ***** *****
*******************************************

这是我使用循环所能达到的最佳效果。

rowInput = int(input("Number of Rows: "))
rowCount = 0
min = rowInput
max = rowInput

while (rowCount < rowInput):
  digit = 1
  while (digit < min): 
    print(end=" ")
    digit += 1
  while (digit >= min and digit <= max):
    print(end="*")
    digit += 1
    
  print()
  min -= 1
  max += 1
  rowCount += 1

输入:

Number of Rows: 4

输出:

   *
  ***
 *****
*******

我认为它可以与顶部的另一个循环一起使用,但我想不出增加两个三角形之间空间的可行方法。还有其他选择吗?

您可以使用嵌套列表理解构建要打印的行列表,但这有点复杂。

rows = 4

lines = [" "*(rows-r//2-1)*(2*rows-1) +  f"{'*'*i:^{2*rows-1}}"*r
         for r in range(1,2*rows+1,2)
         for i in range(1,2*rows+1,2)]

print(*lines,sep='\n')

                        *   
                       ***  
                      ***** 
                     *******
                 *      *      *   
                ***    ***    ***  
               *****  *****  ***** 
              *********************
          *      *      *      *      *   
         ***    ***    ***    ***    ***  
        *****  *****  *****  *****  ***** 
       ***********************************
   *      *      *      *      *      *      *   
  ***    ***    ***    ***    ***    ***    ***  
 *****  *****  *****  *****  *****  *****  ***** 
*************************************************

为了更容易理解代码,for 循环可能更好:

rows = 4

width = 2*rows-1                          # width of one pyramid
for r in range(1,rows+1):                 # row with r pyramids
    indent = " "*(rows-r)*width           # indent pyramids
    for p in range(rows):                 # pyramid lines 
        fill = "*"*(2*p+1)                # filled width/stars for line
        print(indent+(2*r-1)*f"{fill:^{width}}") # repeated pyramid stars

解决此问题的另一个好方法是将问题分解为您在各个函数中实现的更小的部分。结合执行小任务的功能可以更轻松地实施和测试您的解决方案:

# produce lines for one pyramid
def pyramid(n):
    return [f"{'*'*r:^{2*n-1}}" for r in range(1,2*n+1,2)]

# combine pyramids horizontally
def pyramidRow(count,n): 
    return [count*line for line in pyramid(n)]

width = 2*rows-1                          # width of one pyramid
for r in range(1,rows+1):                 # row of r pyramids
    indent = " "*width*(rows-r)           # indent pyramids 
    for line in pyramidRow(2*r-1,rows):   # print repeated pyramids
        print(indent+line)

测试:

for line in pyramid(4): print(line)

   *   
  ***  
 ***** 
*******

for line in pyramidRow(3,4): print(line)

   *      *      *   
  ***    ***    ***  
 *****  *****  ***** 
*********************