n個のオブジェクトを同時にk個使用するときのインデックスのすべての組み合わせを、変化量の小さい順に生成します。
| カテゴリ: | 組み合わせ |
data _null_;
array x[5] $3 ('ant' 'bee' 'cat' 'dog' 'ewe');
array c[3] $3;
array i[3];
n=dim(x);
k=dim(i);
i[1]=0;
ncomb=comb(n, k); /* The one extra call goes back */
do j=1 to ncomb+1; /* to the first combination. */
call allcombi(n, k, of i[*], add, remove);
do h=1 to k;
c[h]=x[i[h]];
end;
put @4 j= @10 'i= ' i[*] +3 'c= ' c[*] +3 add= remove=;
end;
run;j=1 i= 1 2 3 c= ant bee cat add=0 remove=0 j=2 i= 1 3 4 c= ant cat dog add=4 remove=2 j=3 i= 2 3 4 c= bee cat dog add=2 remove=1 j=4 i= 1 2 4 c= ant bee dog add=1 remove=3 j=5 i= 1 4 5 c= ant dog ewe add=5 remove=2 j=6 i= 2 4 5 c= bee dog ewe add=2 remove=1 j=7 i= 3 4 5 c= cat dog ewe add=3 remove=2 j=8 i= 1 3 5 c= ant cat ewe add=1 remove=4 j=9 i= 2 3 5 c= bee cat ewe add=2 remove=1 j=10 i= 1 2 5 c= ant bee ewe add=1 remove=3 j=11 i= 1 2 3 c= ant bee cat add=3 remove=5
%macro test;
%let x1=0;
%let x2=0;
%let x3=0;
%let add=0;
%let remove=0;
%let n=5;
%let k=3;
%let ncomb=%sysfunc(comb(&n, &k));
%do j=1 %to &ncomb;
%syscall allcombi(n, k, x1, x2, x3, add, remove);
%let jfmt=%qsysfunc(putn(&j, 5.));
%put &jfmt: &x1 &x2 &x3 add=&add remove=&remove;
%end;
%mend;
%test1: 1 2 3 add=0 remove=0 2: 1 3 4 add=4 remove=2 3: 2 3 4 add=2 remove=1 4: 1 2 4 add=1 remove=3 5: 1 4 5 add=5 remove=2 6: 2 4 5 add=2 remove=1 7: 3 4 5 add=3 remove=2 8: 1 3 5 add=1 remove=4 9: 2 3 5 add=2 remove=1 10: 1 2 5 add=1 remove=3