*我需要根据整数输入制作一个三角形图案的三角形。
例如:
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_space和b_space是什么,这里有一个描述空间的视觉表示。
a_space在每个三角形之后收缩,并且b_space在每个水平之后收缩。
a_space = " " * (n - triangle - 1) * base
b_space = " " * (n - level - 1)
Run Code Online (Sandbox Code Playgroud)
我们乘以a_space是base因为 1a_space的长度等于底数。
让我们一步步来看。
- 首先,我们以 开始我们的生产线
a_space。Run Code Online (Sandbox Code Playgroud)a_space
- 然后,我们打印出星号。星号的数量遵循奇数的模式。
Run Code Online (Sandbox Code Playgroud)"*" * (level * 2 + 1)
- 我们用 来打开和关闭星号
b_space。Run Code Online (Sandbox Code Playgroud)b_space + "*" * (level * 2 + 1) + b_space
- 然后,我们只需将整个结果乘以水平相邻堆叠的三角形的数量。
Run Code Online (Sandbox Code Playgroud)(b_space + "*" * (level * 2 + 1) + b_space) * (triangle * 2 + 1)
将所有内容放在一起,我们得到该行,将其右剥离,然后打印出来。
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)
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示例),我们可以使用该代码用三角形制作三角形。
与其他答案不同,我们不需要为这里发挥作用的两层“三角形”使用单独的逻辑。