Andrej Hatzi
Andrej Hatzi

Reputation: 342

How to insert elements into a List using a recursive function and then print it in Ocaml

What is the right way to append items to a list inside a recursive function?

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

another Example:

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

I want to append a value to a list inside a function and then print the elements of the list.

Upvotes: 0

Views: 305

Answers (2)

vivienr
vivienr

Reputation: 11

What you mean by "the right way" is not quite clear. The functional "right way" would be not to use references. The efficiency "right way" would be to prepend rather than to append.

Another direct way to build a list inspired from user4624500's answer could be:

let rec f = function 
  | 0 -> [0]
  | n -> n :: f (n-1)

(note: that's not tail recursive, and would uglily fail with negative numbers...)

Then the following expression calls the previous function to build the list and then print the result (adding newlines for readability purposes):

let my_list = f 10 in
List.iter (fun n -> print_int n; print_newline ()) my_list

Upvotes: 0

user4624500
user4624500

Reputation: 316

If you want to print [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();;  

or better without ref

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();; 

but I am not sure of what you want to do...

Upvotes: 1

Related Questions