И вы пишете с использованием низкоуровневых идиом, когда высокоуровневое программирование будет работать намного лучше. Например
let rem l = List.filter (fun x -> x <= l)
Ваш алгоритм (minfree1) также выполняет несколько проходов для ваших данных (один для вычисления длины, другой для фильтрации, повтор). Если бы вы работали над парой списка и его длиной, это было бы быстрее. В любом случае это похоже на задачу, где потребуется некоторая фактическая структура данных [списки - это уровень сборки функциональной программы ...]