Я пытаюсь реализовать наглядную иллюстрацию треугольника Паскаля с помощью Python Mode for Processing для 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, но другие результаты при обработке. Задачи начинаются в 35-й строке треугольника (отсчет начинается с 0). 16-й элемент в этой строке должен быть равен 4059928950, но при обработке вычисляется -235038346. И с этого момента расчеты в Processing часто кажутся ошибочными.
@JohanL Обработка — это гибкий программный блокнот и язык для обучения программированию. Читайте вики по тегу обработка!
Я думаю, что JohanL на правильном пути: AFAIK Python Mode использует Jython, так что это может быть переполнение типа java long
@JohanL Processing — это среда разработки визуально ориентированных приложений (обработка.org — py.processing.org).
Просто предположим, что если визуальный дисплей, который вы имеете в виду, представляет собой эффект, подобный треугольнику Серпинского, полученный путем взятия коэффициентов по модулю некоторого числа - включите модуль в расчеты, чтобы переполнение не было проблемой.
@John Coleman Вы угадали правильно! :-) И ваше предложение действительно то, что я действительно сделал, чтобы избежать проблемы, но я также хотел бы отобразить биномиальные коэффициенты. И я еще не нашел обходного пути для целочисленного переполнения. Согласно отзыву одного из участников Python Mode for Processing, обработка поддерживает только целые числа Java.






Наиболее принципиальным подходом было бы найти большую целочисленную библиотеку, которую вы можете вызвать из 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
Спасибо большое. Я реализовал ваш код, и он работает хорошо.
Что такое «Обработка»? Причина ошибки в том, что Python допускает произвольно большие целые числа, тогда как кажется, что вы получаете переполнение с помощью «Обработки».