Ahora, no me he aplicado a la programación funcional durante, casi 20 años, cuando no llegamos mucho más allá de escribir factoriales y fibs, entonces realmente estoy apelando a la comunidad para que me ayude a encontrar una solución.Cómo iterar sobre todos los subconjuntos de un conjunto de números que suman alrededor de 0
Mi problema es el siguiente:
"Dado un grupo de objetos comerciales, que desea encontrar todas las combinaciones de los comercios que neta a cero +/- cierta tolerancia."
Mi plato de diez es:
let NettedOutTrades trades tolerance = ...
Supongamos que mi punto de partida es una matriz previamente construido de tuplas (comercio, valor). Lo que quiero volver es una matriz (o lista, lo que sea) de matrices de intercambios que se redireccionan. Por lo tanto:
let result = NettedOutTrades [| (t1, -10); (t2, 6); (t3, 6); (t4; 5) |] 1
se traduciría en:
[|
[| t1; t2; t4 |]
[| t1; t3; t4 |]
|]
estoy pensando que esto podría lograrse con una construcción recursiva cola, usando dos acumuladores - uno para los resultados y uno para la suma del comercio valores. Pero, ¿cómo ponerlo todo junto ...?
Estoy seguro de que podría eliminar algo de procedimiento usando C#, pero simplemente no se siente como la herramienta adecuada para el trabajo. Estoy convencido de que va a haber una solución elegante, concisa y eficiente que use la funcionalidad paradigma ... ¡No estoy lo suficientemente bien entrenado como para identificarlo en este momento!
es posible que desee editar su ejemplo; debe ser ** (t1, -11) **, por lo que saldrá – BrokenGlass
También el problema para cada operación es equivalente al ** problema de suma de subconjuntos ** (http: // en.wikipedia.org/wiki/Subset_sum_problem) que es NP-completo. – BrokenGlass
@BrokenGlass: Supongo que Brett definió 1 como una brecha de tolerancia como se menciona en el problema original ("... esa red a cero +/- cierta tolerancia"). – froeschli