私は再帰的割り当ての問題の周りに頭を抱えようとしています。
基本的に、集合Aの各要素について、集合Bから要素を割り当てようとしています。ここで、| A | < = | B |。
Bの要素は、Aからの1つの要素にのみ割り当てられ、「安全」基準を満たす場合にのみ割り当てられます。
Pythonでこの問題のより小さなバージョンを(より簡単な安全性チェックで)処理すると、以下のようになります。f(A、B)は、Bのセットを割り当てようとすると基準による集合の再帰的割り当て
A = ["A0","A1","A2"]
B = ["B0","B1","B2","B3"]
def issafe(a,b):
return int(a[1]) <= int(b[1])
def f(A,B):
if A == []:
return []
else:
for i in range(len(B)):
if issafe(A[0],B[i]):
return [(A[0],B[i])] + f(A[1:],B[0:i]+B[i+1:])
だから、最初のセットでのに対するBさんのから安全割り当てがある
f(A,B)
=> [('A0', 'B0'), ('A1', 'B1'), ('A2', 'B2')]
を機能を実行しています。しかし、1つの可能な安全配分だけです。
私は、このソリューションをどのように拡張してすべての安全な割り当てを提供するかについて、誰かに私に助言を与えることができると考えていました。
ので
f(A,B)
=> [[('A0', 'B0'), ('A1', 'B1'), ('A2', 'B2')],
[('A0', 'B1'), ('A1', 'B2'), ('A2', 'B3')],
[ ... ]]
のようなもの:これはツリー構造の出力を与える
def f(A,B):
C = []
if A == []:
return []
else:
for i in range(len(B)):
if issafe(A[0],B[i]):
C.append([(A[0],B[i])] + f(A[1:],B[0:i]+B[i+1:]))
return C
を:
私はあると信じて[
[('A0', 'B0'),[('A1', 'B1'), [('A2', 'B2')], [('A2', 'B3')]], [('A1', 'B2'), [('A2', 'B3')]], [('A1', 'B3'), [('A2', 'B2')]]],
[('A0', 'B1'), [('A1', 'B2'), [('A2', 'B3')]], [('A1', 'B3'), [('A2', 'B2')]]],
[('A0', 'B2'), [('A1', 'B1'), [('A2', 'B3')]], [('A1', 'B3')]],
[('A0', 'B3'), [('A1', 'B1'), [('A2', 'B2')]], [('A1', 'B2')]]
]
正しい、しかし私はまだsurではないもし安全な割り当ての集合そのものをツリーに並べる方法があれば、
それはあなたの助けと提案のための整理をするときにその私は同意する、あなたが言ったことの他の部分と私は問題を抱えています最後のドットポイント、完全に理解する。これは、私の関数が完成したリストを追加するための追加の入力を必要とすることを意味しますか?そしてもしそうなら、再帰の中で関数を呼び出すのはいかがですか? – CptB3RRY
あなたは** for **ループに結果を追加してから**そのリストを**関数の結果として返します。 – Prune
あなたのコメントに応じて変更を加えると、「ツリー構造」が得られます(私は質問に変更を掲載しました)。これは、関数の外にすべてのソリューションを与えるために再フォーマットすることができますが、私はちょうどあなたが意味していたか、または私はまだ欠けているものがあるかどうかを確認したいと思った。 – CptB3RRY