我正在尝试编写一个函数,它返回带有非负整数和给定总和$ n $的s元组(每个元组的总和是$ n $)。在程序中,我需要使用s嵌套循环:
for i1 from 0 to n do
for i2 from 1 to n do
...
for is from 1 to n do
end for;
end for;
end for;
我怎么能只使用几个循环而不是s循环?非常感谢你。
答案 0 :(得分:2)
我建议使用combinat:-composition()
命令。该命令本身不包含零项,但您可以在最后对每个项中的n+s
进行分区并删除1
:
restart;
partitions := proc( n :: posint, s :: posint, { allowzero :: truefalse := false } )
local P, u:
if allowzero = false then
P := convert( combinat:-composition( n, s ), 'list' ):
return select( u -> numelems(u) = s, P ):
else
P := procname( n + s, s, ':-allowzero'=false ):
return map( u -> u -~ 1, P ):
end if:
end proc:
partitions( 5, 2, ':-allowzero'=false ); # [ [1,4], [2,3], [3,2], [4,1] ]
partitions( 5, 2, ':-allowzero'=true ); # [ [0,5], [1,4], [2,3], [3,2], [4,1], [5,0] ]