4

我在 Ocaml 中编写了这个函数,但我想先应用尾递归然后再编写相同的东西fold_left

let rec check fore list = 
    match list with 
    | [] -> [] | h :: t -> 
        if fore h 
        then h :: check fore t 
        else check fore t ;;

这就是我到目前为止所做的。它返回一个大于给定参数的列表(即最初给定列表时)。示例:check (fun a -> a >= 6 )[5;4;8;9;3;9;0;2;3;4;5;6;61;2;3;4]返回# - : int list = [8; 9; 9; 6; 61]

任何帮助,将不胜感激。

4

2 回答 2

4

你为什么不使用List.filter

List.filter (fun a -> a >= 6) [5;4;8;9;3;9;0;2;3;4;5;6;61;2;3;4]
于 2013-11-04T15:47:40.417 回答
4

对于尾递归,您必须向check函数添加一个附加参数(累加器)。通常这是通过使用累加器的初始值调用的附加内部函数透明的。

let rec check acc fore list = 
  match list with 
  | [] -> acc
  | h :: t -> 
    if fore h 
      then check (h::acc) fore t 
      else check acc fore t

您可能需要List.rev在最后做 a (第三行),但在这种情况下可能没有必要。

于 2013-11-04T15:48:46.653 回答