我尝试使用Python模式对Mac OS X进行处理时,用Pascal三角形实现可视化插图。当然,必要的步骤之一是计算三角形每一行中的二项式系数。我选择以递归的方式而不是计算阶乘。我的代码在Jupyter中运行良好,但在Processing中产生了不同的结果。有谁知道为什么以及如何解决这个问题?
rows = 301
pascal=[[1], [1,1]]
for i in range (rows):
last_row = pascal[len(pascal)-1]
next_row = [1] +[last_row[i]+last_row[i+1] for i in range(len(last_row)) if i < len(last_row)-1] +[1]
pascal.append(next_row)
print (pascal[35][16])
在Jupyter中执行时,代码产生正确的结果,但是在Processing中产生不同的结果。问题从三角形的第35行开始(计数从0开始)。该行中的第16个元素应为4059928950,但处理计算为-235038346。从那时起,“处理”中的计算似乎常常是错误的。
答案 0 :(得分:1)
最原则的方法是找到一个可以从Jython调用的大整数库,但是由于您所需要的只是加法,因此编写自己的函数很容易,它将使用两个以10为底的正整数字符串表示形式,并且返回其总和的字符串表示形式:
rows = 301
def add_nums(s1,s2):
#reverse strings and 0-pad to be of the same length
s1 = s1[::-1]
s2 = s2[::-1]
s1 += '0'*(max(len(s1),len(s2)) - len(s1))
s2 += '0'*(max(len(s1),len(s2)) - len(s2))
dsum = []
c = 0 #carry
for d1,d2 in zip(s1,s2):
a,b = int(d1), int(d2)
c,r = divmod(a+b+c,10)
dsum.append(str(r))
if c > 0: dsum.append('1')
return ''.join(reversed(dsum))
pascal=[['1'], ['1','1']]
for i in range (rows):
last_row = pascal[len(pascal)-1]
next_row = ['1'] +[add_nums(last_row[i],last_row[i+1]) for i in range(len(last_row)) if i < len(last_row)-1] +['1']
pascal.append(next_row)
print (pascal[35][16]) #prints 4059928950