n個の項目のすべてのサブセットを変化量の小さい順に生成します。
カテゴリ: | 組み合わせ |
数値変数を指定します。CALL GRAYCODEルーチンを実行する前に、kを次のいずれかの値に初期化します。
0または1を値とする数値変数を指定します。CALL GRAYCODEの実行時に更新されます。numeric-variable-jの値が1の場合、j番目の項目がサブセットにあることを表します。numeric-variable-jの値が0の場合、j番目の項目がサブセットにないことを表します。
長さが少なくともn文字の文字変数を指定します。先頭のn文字でどの項目がサブセットにあるかを示します。デフォルトでは、j番目の位置にある"I"はj番目の項目がサブセットにあり、j番目の位置にある"O"はj番目の項目がサブセットにないことを示します。これらの2文字はin-out引数の指定で変更できます。
data _null_; x='++++'; n=length(x); k=countc(x, '+'); put ' 1' +3 k= +2 x=; nsubs=2**n; do i=2 to nsubs; call graycode(k, x, n, '+-'); put i 5. +3 k= +2 x=; end; run;
1 k=4 x=++++ 2 k=3 x=-+++ 3 k=2 x=-+-+ 4 k=3 x=++-+ 5 k=2 x=+--+ 6 k=1 x=---+ 7 k=0 x=---- 8 k=1 x=+--- 9 k=2 x=++-- 10 k=1 x=-+-- 11 k=2 x=-++- 12 k=3 x=+++- 13 k=2 x=+-+- 14 k=1 x=--+- 15 k=2 x=--++ 16 k=3 x=+-++
%macro test; %let n=3; %let x1=.; %let x2=.; %let x3=.; %let k=-1; %let nsubs=%eval(2**&n + 1); %put nsubs=&nsubs k=&k x: &x1 &x2 &x3; %do j=1 %to &nsubs; %syscall graycode(k, x1, x2, x3); %put &j: k=&k x: &x1 &x2 &x3 sysinfo=&sysinfo; %end; %mend; %test;
nsubs=9 k=-1 x: ...1: k=0 x: 0 0 0 sysinfo=0 2:k=1 x: 1 0 0 sysinfo=1 3:k=2 x: 1 1 0 sysinfo=2 4:k=1 x: 0 1 0 sysinfo=1 5:k=2 x: 0 1 1 sysinfo=3 6:k=3 x: 1 1 1 sysinfo=1 7:k=2 x: 1 0 1 sysinfo=2 8:k=1 x: 0 0 1 sysinfo=1 9:k=0 x: 0 0 0 sysinfo=3
%macro test(n); %*** Initialize the character variable to a sufficiently long nonblank, nonnumeric value. ; %let x=%sysfunc(repeat(_, &n-1)); %let k=-1; %let nsubs=%eval(2**&n + 1); %put nsubs=&nsubs k=&k x="&x"; %do j=1 %to &nsubs; %syscall graycode(k, x, n); %put &j: k=&k x="&x" sysinfo=&sysinfo; %end; %mend; %test(3);
nsubs=9 k=-1 x="___" 1: k=0 x="OOO" sysinfo=0 2: k=1 x="IOO" sysinfo=1 3: k=2 x="IIO" sysinfo=2 4: k=1 x="OIO" sysinfo=1 5: k=2 x="OII" sysinfo=3 6: k=3 x="III" sysinfo=1 7: k=2 x="IOI" sysinfo=2 8: k=1 x="OOI" sysinfo=1 9: k=0 x="OOO" sysinfo=3