从循环构造算术级数

时间:2018-11-13 15:51:24

标签: python

我正在尝试制定一个程序来计算帕斯卡三角形的对角线系数。

enter image description here

对于那些不熟悉它的人,序列的一般术语写在下面。

第一行= 1 1 1 1 1 ....

第二行= N0(自然数)// 1 = 1 2 3 4 5 ....

第三行= N0(N0 + 1)// 2 = 1 3 6 10 15 ...

第四行= N0(N0 + 1)(N0 + 2)// 6 = 1 4 10 20 35 ...

每行的后续序列遵循特定的模式,我的目标是在for循环中以单元数作为输入输出这些序列。

def figurate_numbers(units):
    row_1 = str(1) * units
    row_1_list = list(row_1)

    for i in range(1, units):
    sequences are 
                  row_2 = n // i 
                  row_3 = (n(n+1)) // (i(i+1))
                  row_4 = (n(n+1)(n+2)) // (i(i+1)(i+2))

>>> def figurate_numbers(4): # coefficients for 4 rows and 4 columns
[1, 1, 1, 1]
[1, 2, 3, 4]
[1, 3, 6, 10]
[1, 4, 10, 20]   # desired output

如何在一个循环中同时对ni进行迭代,以使对应行的每个序列都可以输出系数?

2 个答案:

答案 0 :(得分:0)

您可以使用map或list理解来隐藏循环。

def f(x, i): 
    return lambda x: ...

row = [ [1] * k ]

for i in range(k):
   row[i + 1] = map( f(i), row[i])

其中f是函数,它描述对row的前一个元素的依赖性。

其他可能性使递归Fibbonachi适应行。 Numpy库允许使用阵列假药,因此甚至不需要地图。 python还具有预定义的库,用于组合的数量等,也许可以使用。

要有效地进行计算而没有嵌套循环,请使用

中基于Rational Number的解决方案

https://medium.com/@duhroach/fast-fun-with-pascals-triangle-6030e15dced0

from fractions import Fraction

def pascalIndexInRowFast(row,index):
    lastVal=1
    halfRow = (row>>1)

    #early out, is index < half? if so, compute to that instead
    if index > halfRow:     
        index = halfRow - (halfRow - index)

    for i in range(0, index):
        lastVal = lastVal * (row - i) / (i + 1)

return lastVal

def pascDiagFast(row,length):

    #compute the fractions of this diag
    fracs=[1]*(length)
    for i in range(length-1):
        num = i+1
        denom = row+1+i
        fracs[i] = Fraction(num,denom)

    #now let's compute the values
    vals=[0]*length

    #first figure out the leftmost tail of this diag
    lowRow = row + (length-1)
    lowRowCol = row
    tail = pascalIndexInRowFast(lowRow,lowRowCol)

    vals[-1] = tail

    #walk backwards!
    for i in reversed(range(length-1)):
        vals[i] = int(fracs[i]*vals[i+1])

return vals

答案 1 :(得分:0)

不要重新发明三角形:

>>> from scipy.linalg import pascal
>>> pascal(4)
array([[ 1,  1,  1,  1],
       [ 1,  2,  3,  4],
       [ 1,  3,  6, 10],
       [ 1,  4, 10, 20]], dtype=uint64)
>>> pascal(4).tolist()
[[1, 1, 1, 1], [1, 2, 3, 4], [1, 3, 6, 10], [1, 4, 10, 20]]