我正在尝试编写一个函数,该函数将接受如下输入:
repeat 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]
对于相同的输入。我可以做什么来解决这个问题?
你快要结束了;)
只需修改第一个助手:
let rec helper acc n l =
if n = 0 then acc else helper (l @ acc) (n-1) l ;;
您将接近解决方案。 (您只想复制输入列表,因此 @ 可以将此列表连接到 acc,您不想解析列表的每个元素,所以 :: 不是您需要的)
我认为这个解决方案在复杂性(和简单性)方面可能会更快一些:
let repeat ls n =
let rec f l = function
| 0 -> l
| n -> f (List.rev_append ls l) (n-1) in
List.rev (f [] n)
而且我总是忘记
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)
注意:在我看来,Pierre的回答已经足够好了,我的帖子更像是评论。