Последнее появление элемента в списке в OCaml - PullRequest
1 голос
/ 12 октября 2009

Если l - это список, а elem - это элемент, как я могу вернуть последнее вхождение элемента elem в список l? Также верните -1, если элемент не существует в l. Я не совсем понимаю, как использовать рекурсию для перебора списка ...

let rec getLastOccurence l elem = …

Ответы [ 3 ]

3 голосов
/ 13 октября 2009
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;;
1 голос
/ 13 октября 2009

По сути, вам нужно два аккумулятора для отслеживания текущего индекса и максимального индекса, найденного для элемента. Затем вы просто возвращаетесь к концу списка и возвращаете значение «максимального индекса».

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);;
0 голосов
/ 12 октября 2009

Это хвостовой рекурсивный алгоритм для нахождения целого числа в списке:

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 *)
;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...