请在F#中如何使此函数尾递归?

时间:2018-11-12 16:40:12

标签: f# f#-interactive f#-data f#-3.0

让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,我一直在终止进程。拜托,我想知道我做错了什么。

2 个答案:

答案 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