我想知道它出了什么问题。 假设我想获得:
print(triangle(5))
*
*
* *
* *
* * *
我的代码:
def triangle(n):
result = ""
for i in range(n):
if (i+1) % 2 == 1:
result = result + "*\n"
if (i+1) % 2 == 0:
result = " " + result
return result
它只给我
*
*
(答案如下,但我想知道自己的代码出了什么问题)
def triangle(n):
if n == 0:
return ''
elif n % 2 != 0:
return triangle(n-1) + ((n-1)//2)*'* ' + '*\n'
else:
return triangle(n-1) + (n//2)*' *' + '\n'
答案 0 :(得分:1)
当您使用result
时,通过原始n == 5
循环考虑for
。
i result
- ------
0 "*\n"
1 " *\n"
2 " *\n*\n"
3 " *\n*\n"
4 " *\n*\n*\n"
当print
编辑时,其中:
*
*
*
您可以在开头添加一个空格,也可以在结尾添加星号和换行符,具体取决于i
是奇数还是偶数(事实上,i+1
是奇数还是偶数,这似乎不必要的复杂)。那是所有代码。
一个更好的问题可能是:为什么你期望第一个代码有效?
答案 1 :(得分:1)
要打破这个......
行result = result + "*\n"
每行只会添加一个星号。如果将其与模型答案进行比较,则会将' *'
与(n/2)
相乘,后者会打印相当于n
一半的星数,然后附加"\n"
进行插入一条新线。
您的其他情况,看起来您正在尝试添加上一行,但随后缩进。但是,你实际做的是用一个缩进重新绘制整个三角形。那么,对于循环的前几次迭代,您只需要打印空格(请参阅第一个*
之前的两个空格)。这需要更改为使用*
打印正确数量的n
。
模型答案本身使用递归调用来委派打印其他行,这意味着三角函数的批量可以专注于打印单行。将它放入迭代函数中,就像你的一样,可以这样工作:
def triangle(n):
if n == 0:
return ""
result = ""
for i in range(1, n + 1):
if i % 2 != 0:
result += (i / 2) * "* "
result += "*"
else:
result += (i / 2) * " *"
result += "\n"
return result
答案 2 :(得分:1)
“答案”相当于以下代码,您可以更轻松地与自己的代码进行比较:
def triangle(n):
result = ""
for i in range(n):
if (i + 1) % 2 == 1:
result = result + (i//2)*"* " + "*\n"
if (i + 1) % 2 == 0:
result = result + ((i + 1) // 2)*" *" + "\n"
return result
(无论它有什么价值,我会写出与所有这些不同的东西。你看,有不止一种方式。编写Python程序的人最终会读到“应该有一个,最好只有一个,显而易见的方法要做到这一点。“还有很多方法可以做到这一点并不明显。”