Recursion 如何使用递归函数将元素插入列表,然后在Ocaml中打印

Recursion 如何使用递归函数将元素插入列表,然后在Ocaml中打印,recursion,ocaml,Recursion,Ocaml,在递归函数中向列表追加项的正确方法是什么 let () = let rec main m l acc = if (acc = 3) then acc else if (m = 1) then l := 1 :: !l main (m - 1) l else if (m = 2) then l

在递归函数中向列表追加项的正确方法是什么

let () =
    let rec main m l acc =
        if (acc = 3) then
            acc
        else
            if (m = 1) then
                l := 1 :: !l
                main (m - 1) l
            else if (m = 2) then
                l := 2 :: !l
                main (m - 1) l
            else
                l := m :: !l
                main (m - 1) l

    in l = ref []
    let main 10 l 0
    List.iter (fun l -> List.iter print_int l) l
另一个例子:

let () =
    let rec main m =
        if (m = 3) then m
        else
            l := m :: !l;
            main (m + 1) l

    in l = ref []
    let main 0 l
    List.iter (fun l -> List.iter print_int l) l

我想在函数内的列表中附加一个值,然后打印列表中的元素。

如果要打印[1;2;…;10]:

let () =
    let rec main m l =
        if (m = 0) then
            !l
        else begin
            l := m :: !l;
            main (m - 1) l
            end

    in 
    let l = ref [] in
    List.iter print_int (main 10 l); print_newline();;  
或者没有裁判更好

let () =
    let rec main m l =
        if (m = 0) then
            l
        else 
            main (m - 1) (m::l)
    in 
    List.iter print_int (main 10 []); print_newline();; 
但是我不知道你想做什么…

你所说的“正确的方式”是什么意思还不太清楚。功能上的“正确方法”是不使用引用。效率“正确的方法”是预先编写而不是追加

根据user4624500的答案构建列表的另一种直接方法是:

let rec f = function 
  | 0 -> [0]
  | n -> n :: f (n-1)
(注意:这不是尾部递归,如果出现负数,则会失败……)

然后,以下表达式调用previous函数来构建列表,然后打印结果(为了可读性目的添加换行):


你能描述一下你尝试了什么,并解释你发送的代码的目的吗?@Butanium,我发布了另一个例子,我真的只想在列表中添加元素,然后打印列表。在你的第二个例子中发生了很多事情。首先:
List.iter(fun l->List.iter print_int l)l
List.iter
具有类型
('a->unit)->'a List->unit
,因此这推断
l
属于类型
int List List
,但
l
先前已被绑定为类型
'a List ref
的值。您还有
let main 0 l List.iter(fun l->List.iter print_int l)l
,它不是有效的OCaml语法。您可能会发现它非常有指导意义。有一个附加函数。(还有接线员。)@ChrisDutton我真的对那个文档一无所知。这正是我想要它做的!谢谢
let my_list = f 10 in
List.iter (fun n -> print_int n; print_newline ()) my_list