OCaml:打印一个长整型列表,每行 10 个元素
OCaml: Print a long int list 10 elements per row
我正在处理非常长的整数列表,需要一种将它们 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;;
我确信有更好的递归匹配模式的方法,但我想不通。求助!
这是一个函数,它的功能接近您的要求。它没有做任何花哨的事情,它只是计算到目前为止打印的整数数量并在正确的时间插入结束行。
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 的倍数,此代码将留下一个不完整的行。也许您需要修复它。
另一种(但非常接近@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 = ()
我正在处理非常长的整数列表,需要一种将它们 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;;
我确信有更好的递归匹配模式的方法,但我想不通。求助!
这是一个函数,它的功能接近您的要求。它没有做任何花哨的事情,它只是计算到目前为止打印的整数数量并在正确的时间插入结束行。
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 的倍数,此代码将留下一个不完整的行。也许您需要修复它。
另一种(但非常接近@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 = ()