让ListtoTuple(lst:'a list):('a *'a)list =
let rec loop (lt :'a list) acc =
match lt with
| x:: y :: t-> (x,y):: loop t acc
| _ -> acc
loop lst []
问题:ListtoTuple 6 [1..1000000]
我想要这种结果:[(1,2); (3,4); (5,6); (7,8); (9,10)...],但由于StackOverflow,我一直在终止进程。拜托,我想知道我做错了什么。
答案 0 :(得分:2)
您的代码几乎正确。问题在这里:
(x,y):: loop f t acc
您正在连接loop
的结果,这意味着它不是尾递归的,因为它必须等待loop
的结果然后进行连接。
密钥在参数acc
中,该参数代表累加器。这意味着您需要在此处串联结果列表,然后将其传递到下一个级别,直到没有其他要添加的内容为止,然后acc
具有完整的列表,并在此处返回:
| _ -> acc
答案 1 :(得分:1)
来自this thread:
let listToPairList lst =
let rec aux acc lst =
match lst with
| [] -> acc |> List.rev
| x::[] -> (x,x)::acc |> List.rev
| x1::x2::xs -> aux ((x1,x2)::acc) xs
aux [] lst