Гораздо быстрее, чем принятый ответ и выглядит неплохо. Принятый ответ выполняет много раз одну и ту же работу несколько раз, потому что он вычисляет разделы для более низких целых чисел несколько раз. Например, когда n = 22, разница составляет 12,7 секунд против 0,0467 секунд .
def partitions_dp(n):
partitions_of = []
partitions_of.append([()])
partitions_of.append([(1,)])
for num in range(2, n+1):
ptitions = set()
for i in range(num):
for partition in partitions_of[i]:
ptitions.add(tuple(sorted((num - i, ) + partition)))
partitions_of.append(list(ptitions))
return partitions_of[n]
Код по сути такой же, за исключением того, что мы сохраняем разделы с меньшими целыми числами, поэтому нам не нужно вычислять их снова и снова.
Используйте метод ScrollIntoView ListBox, передавая последний элемент. Возможно, вам придется вызвать UpdateLayout непосредственно перед тем, как он заработает.