前のページ|次のページ

CALL LEXCOMBIルーチン

n個のオブジェクトを同時にk個使用するときのインデックスのすべての組み合わせを、辞書式順序で生成します。

カテゴリ: 組み合わせ

構文

CALL LEXCOMBI(n, k, index-1, …, index-k);

必須引数

n

オブジェクトの合計数を指定する数値の定数、変数または式です。

k

各組み合わせのオブジェクト数を指定する数値の定数、変数または式です。

index

返される組み合わせでオブジェクトのインデックスが入る数値変数です。インデックスは1からn(1とnを含む)までの整数です。

ヒント index-1が欠損またはゼロの場合、CALL LEXCOMBIルーチンはindex-k=kまでのインデックスをindex-1=1に初期化します。それ以外の場合は、CALL LEXCOMBIは組み合わせからインデックスの1つを削除し、他のインデックスを追加して新しい組み合わせを作ります。

詳細

CALL LEXCOMBIの処理

初めてLEXCOMBIルーチンを呼び出すときは、先に次のタスクのいずれかを実行します。
  • index-1をゼロまたは欠損値に設定します。
  • index-1からindex-kを1からn(1とnを含む)までの重複しない整数に初期化します。
n個のオブジェクトを同時にk個使用するときの組み合わせ数は、COMB(n,k)で計算できます。n個のオブジェクトを同時にk個使用するときのすべての組み合わせを生成するには、COMB(n,k)回実行するループでLEXCOMBIを呼び出します。

マクロとCALL LEXCOMBIルーチンを使用する

%SYSCALLを使ったマクロ処理からLEXCOMBIルーチンを呼び出す場合は、すべての引数を初期化して数値にする必要があります。%SYSCALLは戻り値を再フォーマットします。
CALL LEXCOMBIルーチンの実行中にエラーが発生すると、次の両方の値が設定されます。
  • &SYSERRには4よりも大きい値が割り当てられます。
  • &SYSINFOには-100よりも小さい値が割り当てられます。
エラーがない場合、&SYSERRはゼロに設定されて、&SYSINFOは次のいずれかの値に設定されます。
  • 1(variable-1の値が変更された場合)
  • j(variable-1からvariable-iは変更されず、j=i+1で、variable-jが変更された場合)
  • –1(重複しないすべての組み合わせが生成済みの場合)

比較

CALL LEXCOMBIルーチンは、n個のオブジェクトを同時にk個使用するときのすべてのインデックスの組み合わせを、辞書式順序で生成します。CALL ALLCOMBIルーチンは、n個のオブジェクトを同時にk個使用するときのすべてのインデックスの組み合わせを、変化量の小さい順に生成します。

例1: DATAステップでCALL LEXCOMBIルーチンを使用する

CALL LEXCOMBIルーチンを使用して辞書式順序で重複しないインデックスの組み合わせを生成する例を次に示します。
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);
   do j=1 to ncomb;
      call lexcombi(n, k, of i[*]);
      do h=1 to k;
         c[h]=x[i[h]];
      end;
      put @4 j= @10 'i= ' i[*] +3 'c= ' c[*];
   end;
run;
次の出力がログに書き込まれます。
   j=1 i= 1 2 3 c= ant bee cat j=2 i= 1 2 4 c= ant bee dog j=3 i= 1 2 5 c= ant bee ewe j=4 i= 1 3 4 c= ant cat dog j=5 i= 1 3 5 c= ant cat ewe j=6 i= 1 4 5 c= ant dog ewe j=7 i= 2 3 4 c= bee cat dog j=8 i= 2 3 5 c= bee cat ewe j=9 i= 2 4 5 c= bee dog ewe j=10 i= 3 4 5 c= cat dog ewe

例2: マクロとCALL LEXCOMBIルーチンを使用し、リターンコードを表示する

次の例では、CALL LEXCOMBIルーチンをマクロで使用します。出力には%SYSINFOマクロ用の値が含まれます。
%macro test;
   %let x1=0;
   %let x2=0;
   %let x3=0;
   %let n=5;
   %let k=3;
   %let ncomb=%sysfunc(comb(&n, &k));
   %do j=1 %to &ncomb+1;
      %syscall lexcombi(n, k, x1, x2, x3);
      %let jfmt=%qsysfunc(putn(&j, 5.));
      %let pad=%qsysfunc(repeat(%str(), 6-%length(&x1 &x2 &x3)));
      %put &jfmt: &x1 &x2 &x3 &pad sysinfo=&sysinfo;
   %end;
%mend;
%test
次の出力がログに書き込まれます。
    1: 1 2 3 sysinfo=1 2: 1 2 4 sysinfo=3 3: 1 2 5 sysinfo=3 4: 1 3 4 sysinfo=2 5: 1 3 5 sysinfo=3 6: 1 4 5 sysinfo=2 7: 2 3 4 sysinfo=1 8: 2 3 5 sysinfo=3 9: 2 4 5 sysinfo=2 10: 3 4 5 sysinfo=1 11: 3 4 5 sysinfo=-1

関連項目:

前のページ|次のページ|ページの先頭へ