繁体   English   中英

尾递归在OCaml中的应用

[英]Application of Tail-Recursion in OCaml

我在Ocaml中编写了这个函数,但我想先编写同样的东西,首先应用tail-recursion然后再使用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] # - : int list = [8; 9; 9; 6; 61]

任何帮助,将不胜感激。

你为什么不使用List.filter

List.filter (fun a -> a >= 6) [5;4;8;9;3;9;0;2;3;4;5;6;61;2;3;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 (第三行),但在这种情况下可能没有必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM