我正在尝试制定一个程序来计算帕斯卡三角形的对角线系数。
对于那些不熟悉它的人,序列的一般术语写在下面。
第一行= 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
如何在一个循环中同时对n
和i
进行迭代,以使对应行的每个序列都可以输出系数?
答案 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]]