在ocaml中使用计数器进行终端递归调用

时间:2017-04-21 15:15:48

标签: recursion terminal ocaml counter caml

我正在OCaml做一个学校项目,在进行递归调用时我必须尽可能使用最多的终端递归调用,但是我不知道如何使用计数器做到这一点,即使教育者认为它是可能的。对此有何帮助?

 let getContactId cl f p = match cl with
    | []                                        -> exit -1
    | (fn, ln, age, mail, tel)::tl when f = All -> if p = fn || p = ln || p = age || p = mail || p = tel then 0 else 1 + getContactId tl f p
    | (fn, _, _, _, _)::tl when f = Firstname   -> if p = fn then 0 else 1 + getContactId tl f p 
    | (_, ln, _, _, _)::tl when f = Lastname    -> if p = ln then 0 else 1 + getContactId tl f p
    | (_, _, age, _, _)::tl when f = Age        -> if p = age then 0 else 1 + getContactId tl f p
    | (_, _, _, mail, _)::tl when f = Email     -> if p = mail then 0 else 1 + getContactId tl f p
    | (_, _, _, _, tel)::tl when f = Phone      -> if p = tel then 0 else 1 + getContactId tl f p
    | (_, _, _, _, _)::tl when f = Id           -> 

1 个答案:

答案 0 :(得分:2)

标准技巧是将计数器作为附加参数传递。

这是FP程序员的一小部分知识。

这是一个用于确定列表长度的非尾递归函数:

let rec ntr_length list =
    match list with
    | [] -> 0
    | _ :: tail -> 1 + ntr_length tail

这是使用额外参数的尾递归转换:

let tr_length list =
    let rec i_length accum list =
        match list with
        | [] -> accum
        | _ :: tail -> i_length (accum + 1) tail
    in
    i_length 0 list