a,b,cという配列データーが存在しており、

a,ab,ac,abc,b,bc,c
という組み合わせを出力するようなPerlのサンプルを掲載したサイトを御願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/10/07 11:01:54
  • 終了:--

回答(3件)

id:ssasame No.1

ssasame回答回数51ベストアンサー獲得回数02005/10/07 14:31:44

ポイント20pt

http://ybbs.data-room.info/8500/0151/00001073.htm

ハードディスク 復元 データ ノート pc at data-room.info

上のようなサイトはいかがでしょうか?

Perlには詳しくないので、このサイトでよいのか分かりません。見当はずれな場合はポイントは結構です。

id:jun0429

ちょっと違います。

2005/10/07 14:34:48
id:makeworld No.2

makeworld回答回数75ベストアンサー獲得回数232005/10/07 23:13:58

ポイント30pt

2番の方の回答をすこし変更すればできます。アルゴリズム的には3番の方の再帰呼び出しの方がわかり易いと思います。


#!/usr/bin/perl


my @data = (”a”, ”b”, ”c”);

for($i = $#data+1; $i; $i--) {

combi($#data+1, $i, ¥&work); # 作業関数も渡す

}


# 組み合わせ(nCr)のパターンを作り、1つずつ作業関数に渡す汎用関数

sub combi {

my ($n, $r, $func) = @_;

$n--; $r--; # 記述簡略化のため1引いておく


my @cnt = (0 .. $r); # ループカウンタ(組み合わせパターン)を初期化

LOOP_TOP:

while (1) {

$func->(@cnt);

for (my $i = 0; $i <= $r; $i++) {

if ($cnt[$r-$i] < $n-$i) {

$cnt[$r-$i]++;

$cnt[$r-$i] = $cnt[$r-$i-1]+1 while $i--;

redo LOOP_TOP;

}

}

last;

}

# 全てのカウンタが更新できなければ終了

}


# 作業関数

sub work {

print ”@data[@_]¥n”; # 組み合わせを表示

}

id:jun0429

ありがとうございました。

助かりました。

2005/10/08 20:07:04

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 mahbo 87 66 0 2005-10-08 00:45:02

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません