F#: целые числа в пару целых чисел
У меня есть функция, которая принимает список целых чисел в качестве аргумента и возвращает список пар в результате. Например, [1;2;3;4]
должен быть возвращен как [(1, 2); (3, 4)]
Я реализовал нижеприведенную функцию для этого.
let listToPairList (list: int list) =
let index,pairList = List.foldBack(fun elem (iAcc,listAcc) ->
if (iAcc % 2 = 0) then
(iAcc - 1,(elem,list.[iAcc + 1])::listAcc)
else
(iAcc - 1,listAcc)) list (list.Length - 1, [])
pairList
Теперь я хочу сделать это с помощью foldBack
функция, но без использования индексов. Кто-нибудь может дать мне представление о том, как это сделать?
Любая помощь будет оценена.
2 ответа
Зачем использовать фолдбек?
Как насчет простой рекурсивной функции
let rec listToPairList = function
| [] -> []
| x::[] -> [(x,x)]
| x::y::xs -> (x,y)::listToPairList xs
Или хвост рекурсивный:
let listToPairList lst =
let rec aux acc = function
| [] -> acc |> List.rev
| x::[] -> (x,x)::acc |> List.rev
| x1::x2::xs -> aux ((x1,x2)::acc) xs
aux [] lst
Вы могли бы использовать int option
чтобы отслеживать следующий элемент в сгибе:
let listToPairList (list: int list) =
let (_, pairList) = List.foldBack (fun elem (pairAcc, listAcc) ->
match pairAcc with
| None -> (Some(elem), listAcc)
| Some(next) -> (None, (elem, next) :: listAcc))
list
(None, [])
pairList
Имейте в виду, что это удалит первый элемент в списке, если вход содержит нечетное количество элементов.