Python中的帕斯卡Triangle

4 投票
4 回答
27659 浏览
提问于 2025-04-16 00:32

我正在制作一个帕斯卡三角形,但我搞不清楚为什么我的代码不管用。它打印出来的结果像这样:

[]
[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))

要开始理解它是如何工作的,可以注意到上面提到的两个简单函数 zipmap 的例子:

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]

在查看这个输出的同时阅读下面的文档,它会开始变得清晰:

如果还是不明白,可以在 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 的示例实现的。

另请参见 https://stackoverflow.com/a/19895685/463994

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]

这就是一个有效的帕斯卡三角形。

撰写回答