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