2009-08-16 33 views
1

私は(Pythonで)次の必要があります再帰的生成+フィルタリング。より良い非再帰的?

  • は(よりかもしれない)長さ12のすべての可能な組を生成
  • (基本的に12桁と三元数)が0、1又は2のいずれかを含みますこれらのタプルを特定の基準に従ってフィルタリングし、不適切なものを削除し、必要なものを保持します。

これまでのところ、小さな長さに対処しなければならなかったので、機能的アプローチはきちんと単純でした。再帰関数はすべての可能なタプルを生成し、フィルタ関数でそれらを取り除きます。私はより大きなセットを持っているので、生成ステップは、ソリューションツリーのほとんどのパスが後で取り除かれるので、必要以上に長い時間がかかりすぎて、作成をスキップできます。ループ内に生成derecurse

  1. 、各新しい12桁エンティティ
  2. にフィルタ基準を適用する再帰アルゴリズムでフィルタリングを統合する、のように:

    私はこれを解決するには、2つのソリューションを持っていますそれがすでに運命にある道に足を踏み入れることを防ぎなさい。

私の好みは1になりますが、私はあなたの意見を聞きたいと思います。特に、関数型プログラミングスタイルがそのようなケースをどのように扱うかに目を向けたいと思います。 myfilterが選択を行い

答えて

4

どの程度

import itertools 

results = [] 
for x in itertools.product(range(3), repeat=12): 
    if myfilter(x): 
     results.append(x) 

。ここでは、例えば、唯一の

ある
def myfilter(x): # example filter, only take lists with 10 or more 1s 
    return x.count(1)>=10 

、私の提案は、(あなたの基準に応じて)ので、それはあなたが多くの多くのリストを生成遅くなることがあり、いくつかのケースでは、あなたのオプション1である、10以上の1代で結果を許可しますあなたは必要ではないが、はるかに一般的で非常に簡単にコーディングすることができます。

編集:hughdbrownのコメントで提案されているように、このアプローチはまた、ワンライナーフォームがあります

results = [x for x in itertools.product(range(3), repeat=12) if myfilter(x)] 
+0

素敵なソリューションが、私は –

+0

アップデートが行わpy2.6に更新する必要があります.... –

+2

一行のリスト内包: 結果= [itertools.product中のxのためのx(範囲は(3)、= 12を繰り返します) if myfilter(x)] – hughdbrown

1

itertoolsはこれに対処するための機能を備えています。しかし、ここでは発電機で扱うの(ハードコードされた)方法がある:

T = (0,1,2) 

GEN = ((a,b,c,d,e,f,g,h,i,j,k,l) for a in T for b in T for c in T for d in T for e in T for f in T for g in T for h in T for i in T for j in T for k in T for l in T) 

for VAL in GEN: 
    # Filter VAL 
    print VAL 
0

私は、反復2進加算器またはハミングコードを実装し、その方法を実行すると思います。