У решения dee-see есть одно приятное свойство - хвостовая рекурсия. Это означает, что он может легко обрабатывать очень большие списки.
Однако, если вы новичок в функциональном программировании, может быть проще начать с более простой версии, которая принимает список ввода и возвращает список вывода непосредственно в качестве результата.
Это на самом деле очень близко к тому, что у вас есть. Логика, которую вам необходимо реализовать, заключается в следующем:
- , если в остальной части списка есть элемент, тогда мы пропускаем его
- , если элемент отсутствует в остальной части списка. список, мы добавляем его
Для этого вам не нужен newList
. Вы можете просто проверить List.contains h t
, поскольку это гарантирует, что вы будете возвращать только последнее вхождение каждого дублированного элемента:
let rec filtered inputList =
match inputList with
| [] -> []
| h::t -> if List.contains h t then filtered t else h::(filtered t)
filtered [1;2;3;2;3;4;5;4;1]
Единственное отличие от вашей функции заключается в условии. Решение от dee-see более сложное, но оно достигает того же результата. Как и в другом ответе, вы можете сделать это более элегантно, используя when
:
let rec filtered inputList =
match inputList with
| [] -> []
| h::t when List.contains h t -> filtered t
| h::t -> h::(filtered t)