【发布时间】:2010-12-06 01:55:08
【问题描述】:
假设l 是一个列表并且elem 是一个元素,我如何返回元素elem 在列表l 中的最后一次出现?如果元素在 l 中不存在,也返回 -1。我不太明白如何使用递归来遍历列表...
let rec getLastOccurence l elem = …
【问题讨论】:
-
您是指最后一次出现的“索引”吗?因为否则返回值(元素和-1)不是同一类型
假设l 是一个列表并且elem 是一个元素,我如何返回元素elem 在列表l 中的最后一次出现?如果元素在 l 中不存在,也返回 -1。我不太明白如何使用递归来遍历列表...
let rec getLastOccurence l elem = …
【问题讨论】:
这是在列表中查找整数的尾递归算法:
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 *)
;;
【讨论】:
(List.rev lst) 上执行此操作以获取列表末尾的偏移量。
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);;
【讨论】: