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

问题描述 投票:0回答:2

我正在尝试编写一个函数,该函数将接受如下输入:

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] 

对于相同的输入。我可以做什么来解决这个问题?

recursion functional-programming ocaml tail-recursion
2个回答
2
投票

你快要结束了;)

只需修改第一个助手:

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

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


1
投票

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

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的回答已经足够好了,我的帖子更像是评论。

© www.soinside.com 2019 - 2024. All rights reserved.