我正在处理很长的整数列表,需要一种方法将它们打印成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;;
我确信有一种更好的方式递归匹配模式,但我无法弄清楚这一点。救命啊!
答案 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 = ()