Как перебирать все подмножества набора чисел, сумма которых равна примерно 0

Я не применил себя функциональному программированию, ох, почти 20 лет, когда мы не продвинулись дальше написания факториалов и выдумок, поэтому я действительно обращаюсь к сообществу за помощью в поиске решения.

Моя проблема заключается в следующем:

«Учитывая группу торговых объектов, я хочу найти все комбинации сделок, которые сводятся к нулю +/- некоторый допуск».

Мой стартовый вариант для десяти:

let NettedOutTrades trades tolerance = ...

Предположим, что моей отправной точкой является ранее построенный массив кортежей (торговля, значение). Что я хочу вернуть, так это массив (или список, что угодно) массивов сделок, которые выводятся.Таким образом:

let result = NettedOutTrades [| (t1, -10); (t2, 6); (t3, 6); (t4; 5) |] 1

приведет к:

   [| 
     [| t1; t2; t4 |]
     [| t1; t3; t4 |]
   |]

Я думаю, что это может быть достигнуто с помощью хвостовой рекурсивной конструкции, используя два аккумулятора - один для результатов и один для суммы торговых значений. Но как собрать все это вместе?

Я уверен, что смогу выбить что-нибудь процедурное с помощью C #, но это просто не похоже на подходящий инструмент для работы - я убежден, что будет элегантное, лаконичное, эффективное решение, использующее функциональную парадигму ... Я просто недостаточно хорошо практиковался, чтобы идентифицировать это в настоящее время!

9
задан ROMANIA_engineer 23 June 2017 в 15:26
поделиться