OCaml:每行打印一个长整数列表10个元素

时间:2016-06-06 20:43:15

标签: printf ocaml

我正在处理很长的整数列表,需要一种方法将它们打印成10行。这是我到目前为止所得到的,现在我被卡住了:

open Printf    
let print_list list = List.iter (printf "%d ") list;;

(* Remove first n elements from list *)
let rec remove n list = 
if n== 0 then list
else match list with
| [] -> []
| hd::tl -> remove (n-1) tl;;

(* Remove and return first n elements from a list  *)
let rec take n list = 
match n with 
| 0 -> []
| _ -> List.hd list :: take (n-1) (List.tl list);;

let rec print_rows list = 
    if List.length list > 10 then
        begin
            let l = take 10 list;
            print_list l;
            print_endline " ";
            print_rows (remove 5 list)
        end else print_list list;;

我确信有一种更好的方式递归匹配模式,但我无法弄清楚这一点。救命啊!

2 个答案:

答案 0 :(得分:1)

这是一个能够做到你想要的东西的功能。它没有做任何花哨的事情,它只计算到目前为止打印的数量,并在正确的时间插入最终线。

let printby10 intlist =
    let iprint count n =
        Printf.printf "%d " n;
        if count mod 10 = 9 then Printf.printf "\n";
        count + 1
    in
    ignore (List.fold_left iprint 0 intlist)

如果整数的数量不是10的倍数,则此代码会留下不完整的行。可能您需要解决此问题。

答案 1 :(得分:1)

另一个(但非常接近@Jeffrey Scofield)的方法是使用标准函数List.iteri,它提供当前元素的索引:

let print_by_rows n_per_row =
  List.iteri (fun i x ->
     print_int x;
     if (i + 1) mod n_per_row <> 0 then print_string " "
     else print_newline ())

测试:

μ> print_by_rows 10 (Array.to_list (Array.make 20 42));;
42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42
- : unit = ()

还有一个:

μ> print_by_rows 5 (Array.to_list (Array.make 20 42));;
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
42 42 42 42 42
- : unit = ()