首页 > 解决方案 > 使用给定值的python打印三角金字塔

问题描述

我打印了一个像这样的三角金字塔:

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

我的代码是:

for i in range(1,6):
    for j in range(6-i):
        print(" ", end="")
    for j in range(i):
        print("*", end=" ")
    print()

我想打印一个像这个星形金字塔这样的三角形:如果我输入 1:打印第一张图像,那么如果我输入 2,则打印第二张。我想知道实际的逻辑。

在此处输入图像描述

标签: pythonpython-3.x

解决方案


考虑到代码的可扩展性,我定义了两个参数,size并且layer

  • size是三角形的高度也是底部的星号
  • layer是你要堆积的三角形层

以下是一些关键点:

  1. str.center在这里很有帮助。如果我们知道width,它可以自动把它放在它的中间。所以在 的帮助下center,如果我们计算星数和margine它们之间。我们可以很容易地建立一个三角形。

  2. 实现生成单个三角形的函数:首先打印top,然后body,最后bottom

  3. 在同一层将单个三角形组合在一起,第0层有1个三角形,第1层有2个三角形......我们可以计算当前层的三角形数量并通过相应的字符串将它们连接起来,然后再将total_width它们放在中心。

这是我的解决方案:

from functools import reduce

def generate_triangle(size, width):
    res = []
    # print top
    res.append('*'.center(width))

    # print body
    margin = 1
    for i in range(size - 2):
        res.append(('*' + ' ' * margin + '*').center(width))
        margin += 2

    # print bottom
    res.append(' '.join('*' * size).center(width))
    return res

def generate_triangles(size, layer):
    width = size * 2 - 1
    total_width = layer * (width + 1) - 1
    res = []
    for i in range(layer):
        res += reduce(lambda x, y: x + [' '.join(y for _ in range(i + 1)).center(total_width)],
                      generate_triangle(size, width), [])
    return res

测试代码:

def triangle_test():
    def print_matrix(matrix):
        for row in matrix:
            print(row)
        print()

    print_matrix(generate_triangles(6, 1))
    print_matrix(generate_triangles(5, 2))
    print_matrix(generate_triangles(4, 4))

输出:

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

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

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

希望对您有所帮助,如果您还有其他问题,请发表评论。:)


推荐阅读