1

假设l是一个列表并且是一个元素,我怎样才能返回列表elem中元素的最后一次出现?如果元素不存在,也返回 -1 。我不太明白如何使用递归来遍历列表...elemll

let rec getLastOccurence l elem = …
4

3 回答 3

3
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;;
于 2009-10-13T06:51:32.857 回答
1

基本上,您需要两个累加器来跟踪当前索引和为元素找到的最大索引。然后你只需递归到列表的末尾并返回“最大索引”值。

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);;
于 2009-10-13T06:54:43.100 回答
0

这是用于在列表中查找整数的尾递归算法:

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 *)
;;
于 2009-10-12T18:25:43.023 回答