Я портирование функции, которая принимает в целом и выплевывает целые разделы этого числа, то естьЦелых разделы в общей шепелявости
(partitions 4)
должен давать
((4) (3 1) (2 2) (2 1 1) (1 1 1 1))
то есть, списки разделов сначала сортируются по самой большой части, затем второй по величине части и т. д. И сумма представляет собой целое число, которое мы разделяем.
В кленовом пакете SF Джона Stembridge это производится с помощью следующей подпрограммы, которая производит перегородки с диаграммой в окне, определенное 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))
Какой у вас код? –
@RainerJoswig См. Править. –