如何修复 Python 处理模式中的错误计算?
How to fix wrong calculations in Python Mode for Processing?
我尝试使用 Python 处理模式 MAC OS X 实现帕斯卡三角形的可视化图示。当然,必要的步骤之一是计算三角形每一行的二项式系数。我选择以递归方式而不是计算阶乘。我的代码在 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 行开始(countig 从 0 开始)。此行中的第 16 个元素应为 4059928950,但 Processing 计算出 -235038346。而且从那以后,Processing里的计算好像经常出错
最有原则的方法是找到一个可以从 Jython 调用的大整数库,但是由于您所需要的只是加法,因此很容易编写您自己的函数,该函数将接受正数的两个以 10 为底的字符串表示形式整数和 return 它们总和的字符串表示形式:
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
我尝试使用 Python 处理模式 MAC OS X 实现帕斯卡三角形的可视化图示。当然,必要的步骤之一是计算三角形每一行的二项式系数。我选择以递归方式而不是计算阶乘。我的代码在 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 行开始(countig 从 0 开始)。此行中的第 16 个元素应为 4059928950,但 Processing 计算出 -235038346。而且从那以后,Processing里的计算好像经常出错
最有原则的方法是找到一个可以从 Jython 调用的大整数库,但是由于您所需要的只是加法,因此很容易编写您自己的函数,该函数将接受正数的两个以 10 为底的字符串表示形式整数和 return 它们总和的字符串表示形式:
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