尝试在OCaml中复制列表中的元素n次

时间:2017-09-16 22:57:59

标签: recursion functional-programming ocaml tail-recursion

我试图编写一个可以输入的函数,如:

  

重复3 [1; 2] ;;

并显示如下内容:

  

[1; 2; 1; 2; 1; 2]

现在我的代码是:

let repeat ls n =
     let rec helper acc n l =
       if n = 0 then acc else helper (l :: acc) (n-1) l in
     let rec helper2 acc = function
       | [] -> acc
       | h :: t -> helper2 (helper acc n h) t  in helper2 [] (List.rev ls);;

给出了输出:

[1;1;1;2;2;2] 

输入相同的内容。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

你快要结束了;)

只需修改第一个帮手:

   let rec helper acc n l =
   if n = 0 then acc else helper (l @ acc) (n-1) l ;;

您将接近解决方案。 (你只是想复制输入列表,所以@可以将这个列表连接到acc,你不想解析列表中的每个元素,所以::不是你需要的)

答案 1 :(得分:1)

我认为这个解决方案在复杂性(和简单性)方面可能会快一点:

List.rev

另外,我总是忘记let repeat ls n = let rec rev l = function | [] -> l | a::t -> rev (a::l) t in let rec f l = function | 0 -> l | n -> f (List.rev_append ls l) (n-1) in rev [] (f [] n) 是否是尾递归,所以这可能会更好:

using com.espertech.esper.compat;
DateTime engineTime = DateTimeHelper.UtcFromMillis(_esperSvc.EPRuntime.CurrentTime);

注意:在我看来Pierre's answer已经足够好了,我的帖子更像是评论。