我有一个函数,该函数接受一个整数列表作为参数,并返回一对结果列表。例如,[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
函数但不使用索引来做到这一点。谁能给我一个关于如何制作的想法?
任何帮助将不胜感激。
答案 0 :(得分:3)
为什么要使用折返?
一个简单的递归函数
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
答案 1 :(得分:1)
您可以使用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
请注意,如果输入中包含奇数个元素,它将删除列表中的第一项。