假设l
是一个列表并且是一个元素,我怎样才能返回列表elem
中元素的最后一次出现?如果元素不存在,也返回 -1 。我不太明白如何使用递归来遍历列表...elem
l
l
let rec getLastOccurence l elem = …
let findi x l =
let rec loop i n l =
match l with
| y::tl -> loop (i+1) (if y = x then i else n) tl
| [] -> n
in
loop 0 (-1) l;;
基本上,您需要两个累加器来跟踪当前索引和为元素找到的最大索引。然后你只需递归到列表的末尾并返回“最大索引”值。
let rindex elem =
let rec find_index i max_found = function
| (x::xs) when x = elem -> find_index (i+1) i xs
| (_::xs) -> find_index (i+1) max_found xs
| [] -> max_found
in find_index 0 (-1);;
这也可以很简单地表示为折叠:
let rindex elem ls =
let find_index (i, max) elem' = (i+1, if elem' = elem then i else max)
in snd (fold_left find_index (0, -1) ls);;
这是用于在列表中查找整数的尾递归算法:
let find_index elt lst =
(* Wrap inner function that accepts an accumulator to keep the interface clean *)
let rec find_it elt acc = function
| hd :: tl when elt = hd -> acc (* match *)
| hd :: tl -> find_it elt (acc + 1) tl (* non-match *)
| _ -> raise Not_found (* end of list *)
in find_it elt 0 lst (* call inner function with accumulator starting at 0 *)
;;