2017-03-08 2 views
-4

n個の青色のコインとm個の赤いコインのすべての手配をプログラムで表示する方法を見つけようとしています。私は答えがn + m C nだと知っていますが、私はコンピュータにすべてn + m C nの配置を表示します。明らかにするために、nとmが両方とも2の場合、コンピュータが出力する出力は["bbrr", "brbr", "brrb", "rbbr", "rbrb", "rrbb"]です。また、コードは可能であればPythonでなければなりません。もしあなたがPythonを持っていなければ、私は多くの言語を知っているので、まだ動作します。私はitertoolsを使ってみましたが、それぞれの赤いコインが異なるものとして数えられているので動作しません。私はPythonでの区別性について多くのことを調べてみましたが、何も見つかりませんでした。ヘルプは非常に高く評価されます。組合せ表示:すべての手配を表示

+2

これは基本的な研究や試みが欠けているのとは別に、これを探してみるとPythonの標準ライブラリにあるものです2〜3分。 –

+1

あなたがこれまで試みたことを投稿してください。 – James

+1

これは妥当な質問です。標準ライブラリオプション* itertools.combinations *は、入力が重複した値を持ち、ライブラリ関数が異なる入力を想定しているため、ここでは役に立ちません。 –

答えて

1

itertoolsパッケージには、あなたが求めているものがあります。しかし、それは別々のエンティティであることを同一の項目を検討していきますので、私たちは重複

from itertools import permutations 

sorted(set(x for x in permutations('rrbb', 4))) 

[('b', 'b', 'r', 'r'), 
('b', 'r', 'b', 'r'), 
('b', 'r', 'r', 'b'), 
('r', 'b', 'b', 'r'), 
('r', 'b', 'r', 'b'), 
('r', 'r', 'b', 'b')] 
-1

は、この目的のため

F(0、0、currentStr)= currentStrを再帰関数を作成することができ

F(N、M、currentStr)= F(N-1、M、currentStr + "b")とf(n、m-1、currentStr + "r")

+0

mとnが負になり、これは決して終了しません。 n = 0とm = 0の2つの基本ケースを考慮する必要があります。 –

1

をクリーンアップするためにset()を使用することができます。ここはHaskellでの基本的な再帰的なソリューションです。

arrangements :: (Integral n, Integral m) => n -> m -> [String] 
arrangements n 0 = [stimes n "b"] 
arrangements 0 m = [stimes m "r"] 
arrangements n m = (('b' :) <$> arrangements (n - 1) m) 
       <> (('r' :) <$> arrangements n (m - 1)) 

λ> arrangements 2 2 
["bbrr","brbr","brrb","rbbr","rbrb","rrbb"] 

λ> arrangements 2 3 
["bbrrr","brbrr","brrbr","brrrb","rbbrr","rbrbr","rbrrb","rrbbr","rrbrb","rrrbb"] 
関連する問題