Jetzt habe ich mich nicht für die funktionale Programmierung für, oh, fast 20 Jahre, wenn wir nicht viel weiter als das Schreiben von Fakultäten und fibs, also appelliere ich wirklich an die Community um Hilfe bei der Suche nach einer Lösung.Wie man über alle Teilmengen einer Reihe von Zahlen iteriert, die zu ungefähr 0 reichen
Mein Problem ist folgendes: „eine Gruppe von Handelsobjekten gegeben, ich will alle Kombinationen von Geschäften finden, die Netto-Null +/- gewisse Toleranz“
Meine Vorspeise für zehn ist:
let NettedOutTrades trades tolerance = ...
sich mein Ausgangspunkt annimmt, ist ein zuvor konstruierten Array von Tupeln (Handel, Wert). Was ich will, ist ein Array (oder eine Liste, was auch immer) von Arrays von Trades, die herauskommen. Also:
let result = NettedOutTrades [| (t1, -10); (t2, 6); (t3, 6); (t4; 5) |] 1
würde zu:
[|
[| t1; t2; t4 |]
[| t1; t3; t4 |]
|]
Ich denke, dass dies mit einem Schwanz rekursive Konstrukt erreicht werden könnte, zwei Akkumulatoren mit - einer für die Ergebnisse und einen für die Summe des Handels Werte. Aber wie bringt man alles zusammen ...?
Ich bin mir sicher, dass ich mit C# etwas prozesstechnisches Verfahren ausschalten konnte, aber es fühlt sich einfach nicht nach dem richtigen Werkzeug an - ich bin davon überzeugt, dass es eine elegante, prägnante und effiziente Lösung geben wird Paradigma ... Ich bin einfach nicht gut genug geübt, um es jetzt zu identifizieren!
vielleicht möchten Sie Ihr Beispiel bearbeiten - sollte ein ** (t1, -11) ** sein, so dass sie aus – BrokenGlass
net Auch das Problem für jeden Handel entspricht dem ** Subset Summe Problem ** (http: // en.wikipedia.org/wiki/Subset_sum_problem), das NP-vollständig ist. – BrokenGlass
@BrokenGlass: Ich definiere Brett definiert 1 als eine Toleranz Lücke wie im ursprünglichen Problem erwähnt ("... dass Netto auf Null +/- einige Toleranz."). – froeschli