前のページ|次のページ

CALL ALLCOMBIルーチン

n個のオブジェクトを同時にk個使用するときのインデックスのすべての組み合わせを、変化量の小さい順に生成します。

カテゴリ: 組み合わせ

構文

CALL ALLCOMBI(N, K, index-1, …, index-K, <, index-added, index-removed>);

必須引数

N

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

K

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

index

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

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

オプション引数

index-added

追加したインデックスの値を返すためにALLCOMBIが使う数値変数です。

index-removed

削除したインデックスの値を返すためにALLCOMBIが使う数値変数です。

詳細

CALL ALLCOMBIの処理

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

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

%SYSCALLを使ったマクロ処理からALLCOMBIを呼び出す場合は、すべての引数を初期化して数値にする必要があります。&SYSCALLは戻り値の形式を調整します。
CALL ALLCOMBIルーチンの実行中にエラーが発生すると、次の両方の値が設定されます。
  • &SYSERRには4よりも大きい値が割り当てられます。
  • &SYSINFOには-100よりも小さい値が割り当てられます。
エラーがない場合、&SYSERRおよび&SYSINFOはゼロに設定されます。

比較

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

例1: DATAステップでCALL ALLCOMBIを使用する

CALL ALLCOMBIルーチンをDATAステップで使用している例を次に示します。
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

例2: マクロとCALL ALLCOMBIを使用する

CALL ALLCOMBIルーチンをマクロで使用している例を次に示します。
%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;
%test
次の出力がログに書き込まれます。
    1: 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

関連項目:

CALLルーチン:
前のページ|次のページ|ページの先頭へ