检查三角形代码,python

时间:2014-04-27 09:22:42

标签: python

我想知道它出了什么问题。 假设我想获得:

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'

3 个答案:

答案 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程序的人最终会读到“应该有一个,最好只有一个,显而易见的方法要做到这一点。“还有很多方法可以做到这一点并不明显。”