我试图编写一个可以输入的函数,如:
重复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]
输入相同的内容。我该怎么做才能解决这个问题?
答案 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已经足够好了,我的帖子更像是评论。