Я портирую функцию, которая принимает целое число и выдает целочисленные разделы этого числа, то есть
(partitions 4)
должен дать
((4) (3 1) (2 2) (2 1 1) (1 1 1 1))
то есть списки разделов сортируются сначала по наибольшей части, затем по второй по величине части и т. д. И сумма представляет собой целое число, которое мы разбиваем.
В пакете maple SF Джона Стембридж это создается с помощью следующей подпрограммы, которая создает разделы с диаграммой в поле, определяемом row
и col
, так что SF/Par/sub(n,n,n)
это то, что я хочу:
`SF/Par/sub`:=proc(n,row,col) local i;
if n=0 then [[]]
elif col=0 then []
else
[seq(op(map((x,y)->[y,op(x)],`SF/Par/sub`(n+i,-i,col-1),-i)),
i=-min(row,n)..-iquo(n+col-1,col))]
fi
end:
где iquo (floor (/ x y))
Вопрос в том, как добраться из
(2 (2 ()) (1 (1 ())))
результат
((2 2) (2 1 1))
?
Изменить
Ниже моя попытка
(defun partitions (n row col)
""
(block nil
(if (= n 0) (return '(())))
(if (= col 0) (return '()))
(loop for i from (- (min row n)) to (floor (/ (- (+ n col) 1) col))
collect (cons (- i) (partitions (+ n i) (- i) (- col 1))))))
Он запускается и завершается, но это все, что я могу сказать об этом.
(partitions 3 3 3)
урожайность
((3 NIL) (2 (1 NIL) (0 (0) (-1)) (-1 (-1) (-2))) (1 (1 (1 NIL) (0) (-1)) (0 (0) (-1) (-2)) (-1 (-1) (-2) (-3))) (0 (0 (0) (-1) (-2) (-3)) (-1 (-1) (-2) (-3) (-4)) (-2 (-2) (-3) (-4) (-5))) (-1 (-1 (-1) (-2) (-3) (-4) (-5)) (-2 (-2) (-3) (-4) (-5) (-6))))
Я хочу, чтобы он вернулся ((3) (2 1) (1 1 1))