如何在Python模式下修复错误的计算以进行处理?

如何在Python模式下修复错误的计算以进行处理?,python,processing,jython,Python,Processing,Jython,我尝试用Python模式为MAC OS X处理实现Pascal三角形的可视化演示。当然,其中一个必要步骤是计算三角形每行中的二项式系数。我选择以递归的方式来做,而不是计算阶乘。我的代码在Jupyter中运行良好,但在处理过程中会产生不同的结果。有人知道我为什么以及如何解决这个问题吗 rows = 301 pascal=[[1], [1,1]] for i in range (rows): last_row = pascal[len(pascal)-1] next_row = [

我尝试用Python模式为MAC OS X处理实现Pascal三角形的可视化演示。当然,其中一个必要步骤是计算三角形每行中的二项式系数。我选择以递归的方式来做,而不是计算阶乘。我的代码在Jupyter中运行良好,但在处理过程中会产生不同的结果。有人知道我为什么以及如何解决这个问题吗

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])
rows=301
帕斯卡=[[1],[1,1]]
对于范围内的i(行):
最后一行=帕斯卡[len(帕斯卡)-1]
下一行=[1]+[last_row[i]+last_row[i+1],如果i

该代码在Jupyter中执行时生成正确的结果,但在处理过程中有不同的结果。问题从三角形的第35行开始(countig从0开始)。此行中的第16个元素应为4059928950,但处理计算为-235038346。从那时起,处理过程中的计算似乎经常出错。

最有原则的方法是找到一个大整数库,您可以从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
rows=301
def附加值(s1、s2):
#反向字符串和0-pad应具有相同的长度
s1=s1[:-1]
s2=s2[:-1]
s1+='0'*(最大值(len(s1),len(s2))-len(s1))
s2+='0'*(最大值(len(s1),len(s2))-len(s2))
dsum=[]
c=0#进位
对于拉链中的d1、d2(s1、s2):
a、 b=整数(d1),整数(d2)
c、 r=divmod(a+b+c,10)
dsum.append(str(r))
如果c>0:dsum.append('1')
返回“”。加入(反向(dsum))
帕斯卡=['1'],['1','1']]
对于范围内的i(行):
最后一行=帕斯卡[len(帕斯卡)-1]
下一行=['1']+[i
什么是“处理”?这个错误的原因是Python允许任意大的整数,而使用“处理”似乎会产生溢出。@JohanL是一个灵活的软件草图手册,也是一种学习如何编码的语言。阅读标签维基!我认为JohanL的思路是正确的:AFAIK Python模式使用Jython,因此它可能是java
long
类型overflow@JohanLProcessing是面向可视化应用程序的开发环境(-)。猜猜看,如果你心目中的视觉显示是通过取系数mod某个数字得到的Sierpinski三角形效果——在计算中包括模数,所以溢出不是问题。非常感谢。我已经实现了你的代码,它工作得很好。