Python中的帕斯卡Triangle
我正在制作一个帕斯卡三角形,但我搞不清楚为什么我的代码不管用。它打印出来的结果像这样:
[]
[1]
[1, 2]
[1, 3, 3]
[1, 4, 6, 4]
[1, 5, 10, 10, 5]
[1, 6, 15, 20, 15, 6]
[1, 7, 21, 35, 35, 21, 7]
[1, 8, 28, 56, 70, 56, 28, 8]
[1, 9, 36, 84, 126, 126, 84, 36, 9]
这个结果几乎是对的,不过看起来数值的行号高了一个,所以如果把2当作第一行,把1当作第0行,2的值就高了一个,因为它在第一行,应该是1,1。下一行应该是1,2,1,第一个值是对的,但第二个值高了一个,后面的值高了两个。
我试着用append(a-i)这样的方式,但似乎不管用。我该怎么做才能正确打印出来呢?
def triangle(rows):
for rownum in range (rows):
newValue=1
PrintingList = list()
for iteration in range (rownum):
newValue = newValue * ( rownum-iteration ) * 1 / ( iteration + 1 )
PrintingList.append(int(newValue))
print(PrintingList)
print()
4 个回答
1
我遇到了一个错误,不过你可以试试这样做:
row1 = whatever
pascal = [[row/(colum*(row-colum) for row in range(0, colum)] for row in range(1, row1)]]
2
下面的代码有一些打印语句,可以帮助我们理解它是怎么工作的。我是在IPython笔记本中运行的。我的输出看起来是这样的:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
除了输出看起来应该是这样的之外,这个计算方法实际上遵循了帕斯卡三角形的原始定义,每一行都是从上一行构建而来的。(有些方法使用组合数学或阶乘,虽然可能会得到正确的答案,但并没有遵循帕斯卡三角形的原始精神,至少我认为是这样。)
这是代码:
def MakeTriangle(numberOfRows):
"""the print statements are not required. They are just to help see how it works."""
triangle=[[1]] #base case (i.e., 0th row)
print 'triangle[-1] is ', triangle[-1]
for _x in range(numberOfRows - 1): #_x isn't used
zipperd = zip([0] + triangle[-1], triangle[-1] + [0])
print "zipperd: ", zipperd
newRow = map(sum, zipperd)
triangle.append(list(newRow))
print 'triangle[-1] is ', triangle[-1] #to help see how tri is built
print "\n\n"
return triangle
for row in MakeTriangle(5):
print('{0:^50}'.format(row))
要开始理解它是如何工作的,可以注意到上面提到的两个简单函数 zip
和 map
的例子:
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
print zipped #output is [(1, 4), (2, 5), (3, 6)]
print map(sum, zipped) #output is [5, 7, 9]
在 MakeTriangle 函数中加入打印语句后,你会得到这样的输出,帮助你进一步理解代码是如何工作的:
triangle[-1] is [1]
zipperd: [(0, 1), (1, 0)]
triangle[-1] is [1, 1]
zipperd: [(0, 1), (1, 1), (1, 0)]
triangle[-1] is [1, 2, 1]
zipperd: [(0, 1), (1, 2), (2, 1), (1, 0)]
triangle[-1] is [1, 3, 3, 1]
zipperd: [(0, 1), (1, 3), (3, 3), (3, 1), (1, 0)]
triangle[-1] is [1, 4, 6, 4, 1]
在查看这个输出的同时阅读下面的文档,它会开始变得清晰:
- http://docs.python.org/2/library/functions.html#zip
- http://docs.python.org/2/library/functions.html#map
如果还是不明白,可以在 MakeTriangle 的 for
循环中加入这些打印语句:
print "[0] + triangle[-1] is ", [0] + triangle[-1]
print "triangle[-1] + [0] is ", triangle[-1] + [0]
注意,居中打印是通过使用来自 http://docs.python.org/2/library/string.html#format-examples 的示例实现的。
10
我会把 PrintingList = list()
改成 PrintingList = [newValue]
。
然后调用 triangle(10)
会给你以下结果:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
这就是一个有效的帕斯卡三角形。