Python定制Pascal';s三角

Python定制Pascal';s三角,python,recursion,pascals-triangle,Python,Recursion,Pascals Triangle,我有一个Pascal三角形(不包括前两个元素)和自定义三角形: P=[[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]] 第二个帕斯卡是: P2=[[2], [2, 2], [2, 4, 2], [2, 6, 6, 2], [2, 8, 12, 8, 2], [2, 10, 20, 20, 10, 2]] 但我想生成一个新的自定义Pascal三

我有一个Pascal三角形(不包括前两个元素)和自定义三角形:

 P=[[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]]
第二个帕斯卡是:

 P2=[[2],
 [2, 2],
 [2, 4, 2],
 [2, 6, 6, 2],
 [2, 8, 12, 8, 2],
 [2, 10, 20, 20, 10, 2]]
但我想生成一个新的自定义Pascal三角形,如下公式所示:

-get P[0][1]
-add it to P2[0]
-write again P[0][1] as 4.

-get P[1][1]
-add it to P2[0]
-add it to P[0][0:2]
-write again P[1][1] as 7.
最后一个场景将是递归的

结果如下:

 newpascal=[[1, 4, 1],
 [1, 7, 7, 1],
 [1, 10, 18, 10, 1],
 [1, 13, 34, 34, 13, 1],
 [1, 16, 55, 80, 55, 16, 1]]
我的代码不起作用:

#Definition of classical Pascal's Triangle   
def pascal1(n):
    if n == 0:
        return [[1]]
    else:
        final_r = pascal1(n - 1)
        last = [0] + final_r[-1] + [0] # note: this does not modify final_r
        new_row = [last[k] + last[k - 1] for k in range(1, len(last))]
        return final_r + [new_row]
p=pascal1(10)

#Definition of Pascal's Triangle (Times2X)
def pascal2(n):
    if n == 0:
        return [[2]]
    else:
        final_r = pascal2(n - 1)
        last = [0] + final_r[-1] + [0] # note: this does not modify final_r
        new_row = [last[k] + last[k - 1] for k in range(1, len(last))]
        return final_r + [new_row]
p2=pascal2(10)


#My Custom Pascal
def newpascal(n):
    final_r = pascal1(n - 1)
    last = [0] + final_r[-1] + [0] # note: this does not modify final_r
    new_row = [last[k] + last[k - 1]+p2[0][0] for k in range(1, len(last))]
    return final_r + [new_row]

我仔细阅读了你几乎无法理解的指示,并得出以下结论:

def newpascal(n):
    array = pascal1(1)[1]
    p2 = pascal2(n)
    p3 = [list(array)]

    for x, row in enumerate(range(3, n + 2), start=0):

        array.append(1) # both widen the row and initialize last element

        # fill in the row, right to left
        for y, i in enumerate(range(row - 2, 0, -1)):
            # current computed from previous + p2
            array[i] += array[i - 1] + p2[x][y]

        p3.append(list(array))

    return p3
不幸的是,它不是递归的。但这似乎奏效了:

>>> p3 = newpascal(10)
>>> print(*p3, sep='\n')
[1, 1]
[1, 4, 1]
[1, 7, 7, 1]
[1, 10, 18, 10, 1]
[1, 13, 34, 34, 13, 1]
[1, 16, 55, 80, 55, 16, 1]
[1, 19, 81, 155, 155, 81, 19, 1]
[1, 22, 112, 266, 350, 266, 112, 22, 1]
[1, 25, 148, 420, 686, 686, 420, 148, 25, 1]
[1, 28, 189, 624, 1218, 1512, 1218, 624, 189, 28, 1]
>>> 

在您的解释中,
pascal1()
是一种误导,因为解决这个问题不需要它。您只需要从
[[1,1]]
开始。所以,现在是时候给我们提供你解决的“伟大模式”的线索了

您的代码中到底有什么不起作用?你得到了什么?纽帕斯卡的结果是:[[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,28,8,1]、[1,9,36,84,126,126,84,36,9,1]、[3,12,47,122,212,122]我不明白你自定义的Pascal三角形的定义。为什么
[1 4 1]
后面跟着
[1 7 7 1]
?有两个帕斯卡。我使用上面提到的公式混合了其中的两个,然后生成一个新的自定义pascal三角形。为了生成它,我应该使用这两个,原始的和递增的。这里是一个简单的计算:(1+4),得到P2[1]的第一个元素为2。这是第一个7。在这(4+1)之后,得到P2[1]的第二个元素,它又是7。[1 7 7 1]后面必须跟[1 10 18 10 1]。得到(1+7)并添加P2[2]的第一个元素,它是10;获取(7+7)并添加P2[2]的第二个元素,它是(7+7+4)。我知道这更复杂,但我解决了一个很好的模式。没有人看一下背后的代码或逻辑吗?我真的很抱歉我的消息。非常感谢你的评论。因为这个问题有点难,我可能解释不清楚。我生成了解决方案,你的一个也在工作,干得好!