Python 中的重复三角形图案

Clo*_*ver 25 python algorithm

*我需要根据整数输入制作一个三角形图案的三角形。

例如:

n = 2

    *
   ***
 *  *  *
*********
Run Code Online (Sandbox Code Playgroud)

n = 3

            *
           ***
          *****
       *    *    *
      ***  ***  ***
     ***************
  *    *    *    *    *
 ***  ***  ***  ***  ***
*************************
Run Code Online (Sandbox Code Playgroud)

我已经弄清楚了单个三角形的代码,但我不知道如何复制它们,以便它们看起来像三角形的三角形。

这是我的一个三角形的代码:

rows = int(input())

for i in range(rows):
    for j in range(i, rows):
        print(" ", end="")
    for j in range(i):
        print("*", end="")
    for j in range(i + 1):
        print("*", end="")
    print()
Run Code Online (Sandbox Code Playgroud)

Tro*_*oll 55

代码

我简化了以下代码,因此它现在看起来比以前更清晰易于理解。

n = int(input("n = "))

rows = n ** 2
base = n * 2 - 1

for row in range(rows):
    triangle = row // n
    level = row % n

    a_space = " " * (n - triangle - 1) * base
    b_space = " " * (n - level - 1)

    line = (a_space + (b_space + "*" * (level * 2 + 1) + b_space)
        * (triangle * 2 + 1)).rstrip()

    print(line)
Run Code Online (Sandbox Code Playgroud)

怎么运行的

这种方法一次性打印出所有内容。在下面的解释中,我将分解代码的组成部分、这些变量的含义以及它们的工作原理。

高度

我要提到的第一个变量是n,层数或每个三角形的高度。它也是相互堆叠的三角形的数量。

行数

第二个变量是rows,输出中的行数。我们可以看到行数等于n平方的模式。

行数

根据

下一个变量是base. 它是三角形底部星号的数量。正如我们可能已经注意到的,它也遵循奇数的模式。

根据

之后,我们的循环开始,迭代每一行,并打印出结果。

三角形和水平仪

这些变量告诉我们当前处于哪个三角形以及三角形的水平面。triangle您可以通过打印出来和每次迭代来亲自尝试level

for row in range(rows):
    triangle = row // n
    level = row % n

    print(triangle, level)
Run Code Online (Sandbox Code Playgroud)

三角形和水平仪

两种类型的空间

下一部分是缩进。只是为了让您简要了解什么是a_spaceb_space是什么,这里有一个描述空间的视觉表示。

空间

a_space在每个三角形之后收缩,并且b_space在每个水平之后收缩。

a_space = " " * (n - triangle - 1) * base
b_space = " " * (n - level - 1)
Run Code Online (Sandbox Code Playgroud)

我们乘以a_spacebase因为 1a_space的长度等于底数。

打印出该行

让我们一步步来看。

  1. 首先,我们以 开始我们的生产线a_space
a_space
Run Code Online (Sandbox Code Playgroud)
  1. 然后,我们打印出星号。星号的数量遵循奇数的模式。
"*" * (level * 2 + 1)
Run Code Online (Sandbox Code Playgroud)
  1. 我们用 来打开和关闭星号b_space
b_space + "*" * (level * 2 + 1) + b_space
Run Code Online (Sandbox Code Playgroud)
  1. 然后,我们只需将整个结果乘以水平相邻堆叠的三角形的数量。
(b_space + "*" * (level * 2 + 1) + b_space) * (triangle * 2 + 1)
Run Code Online (Sandbox Code Playgroud)

将所有内容放在一起,我们得到该行,将其右剥离,然后打印出来。

line = (a_space + (b_space + "*" * (level * 2 + 1) + b_space)
        * (triangle * 2 + 1)).rstrip()

print(line)
Run Code Online (Sandbox Code Playgroud)

输出

让我们通过一些测试用例来尝试一下。

n = 1

*
Run Code Online (Sandbox Code Playgroud)

n = 2

    *
   ***
 *  *  *
*********
Run Code Online (Sandbox Code Playgroud)

n = 3

            *
           ***
          *****
       *    *    *
      ***  ***  ***
     ***************
  *    *    *    *    *
 ***  ***  ***  ***  ***
*************************
Run Code Online (Sandbox Code Playgroud)

n = 4

                        *
                       ***
                      *****
                     *******
                 *      *      *
                ***    ***    ***
               *****  *****  *****
              *********************
          *      *      *      *      *
         ***    ***    ***    ***    ***
        *****  *****  *****  *****  *****
       ***********************************
   *      *      *      *      *      *      *
  ***    ***    ***    ***    ***    ***    ***
 *****  *****  *****  *****  *****  *****  *****
*************************************************
Run Code Online (Sandbox Code Playgroud)

  • 什么是数学?您能在答案中提供一些提示和参考吗? (4认同)

Lyn*_*ynn 18

我认为这个练习试图教给您的内容如下。

让我们看一下你的三角形代码(它没有什么根本性的错误):

size = int(input())

for i in range(size):
    for j in range(i, size):
        print(" ", end = "")
    for j in range(i):
        print("*", end = "")
    for j in range(i + 1):
        print("*", end = "")
    print()
Run Code Online (Sandbox Code Playgroud)

并将其转换为返回行/行列表的函数:

def triangle(size):
    rows = []
    for i in range(size):
        row = []
        for j in range(i + 1, size):
            row.append(" ")
        for j in range(2 * i + 1):    # i + (i+1) = 2*i+1.
            row.append("*")
        for j in range(i + 1, size):  # Let's add spaces at the end, too.
            row.append(" ")           # It'll make sense in a moment!
        rows.append("".join(row))
    return rows

for row in triangle(5):
    print(row)

#     *
#    ***
#   *****
#  *******
# *********
Run Code Online (Sandbox Code Playgroud)

现在我们可以稍微调整它以使用任何矩形字符串列表“构建块”,而不是*

def triangle(size, block):
    rows = []
    for i in range(size):
        strip = [[] for _ in block]
        for j in range(i + 1, size):
            for s, b in zip(strip, block):
                s.append(" " * len(b))     # Space as wide as the building block
        for j in range(2 * i + 1):
            for s, b in zip(strip, block):
                s.append(b)
        for j in range(i + 1, size):
            for s, b in zip(strip, block):
                s.append(" " * len(b))
        for s in strip:
            rows.append("".join(s))
    return rows


# Make a triangle out of ["abc",
#                         "def"]:

for row in triangle(3, ["abc", "def"]):
    print(row)

#       abc
#       def
#    abcabcabc
#    defdefdef
# abcabcabcabcabc
# defdefdefdefdef
Run Code Online (Sandbox Code Playgroud)

这是有点棘手的代码!尝试print()向此代码添加一些语句以查看其工作原理。zip()并行循环两个列表。实际上,您应该尝试自己从头开始重写这个函数。

回报是非常令人满意的:

fractal = triangle(4, triangle(4, ["*"]))

for row in fractal:
    print(row)

#                         *
#                        ***
#                       *****
#                      *******
#                  *      *      *
#                 ***    ***    ***
#                *****  *****  *****
#               *********************
#           *      *      *      *      *
#          ***    ***    ***    ***    ***
#         *****  *****  *****  *****  *****
#        ***********************************
#    *      *      *      *      *      *      *
#   ***    ***    ***    ***    ***    ***    ***
#  *****  *****  *****  *****  *****  *****  *****
# *************************************************
Run Code Online (Sandbox Code Playgroud)

当然,您现在也可以创建一个“三角形的三角形的三角形”:

for row in triangle(2, triangle(2, triangle(2, ["()"]))):
    print(row)

#                           ()
#                         ()()()
#                     ()    ()    ()
#                   ()()()()()()()()()
#         ()                ()                ()
#       ()()()            ()()()            ()()()
#   ()    ()    ()    ()    ()    ()    ()    ()    ()
# ()()()()()()()()()()()()()()()()()()()()()()()()()()()
Run Code Online (Sandbox Code Playgroud)

这里的教训是概括一个问题:从表面上看,很难制作一个三角形的三角形(三角形的三角形)。但用任何东西制作三角形都相对容易。

如果我们编写一些可以用任何东西制作三角形的代码(如我们的abc def示例),我们可以使用该代码用三角形制作三角形。

与其他答案不同,我们不需要为这里发挥作用的两层“三角形”使用单独的逻辑。