Comment detail
自然数の分割 (Nested Flatten)#4344 の移植。 エラー処理はあまり意味が無いので省いた。 あと、sort とかいらなかったので、これも削除。 (当初は、完全に末尾再帰にしようと思っていて、その時点では順番が崩れるだろうという予想だったんですが……)
rev_map や rev_append でリストの方向がころころ変わってる辺りが OCaml らしいと言えばらしいところ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | let rec split_num' base n m acc =
match n, m with
| _, 0 -> [[n]]
| n, _ when n < 0 -> acc
| n, m ->
let base' = base - n in
let sub = split_num' base' base' (pred m) [] in
let acc' = List.rev_map (fun xs -> n::xs) sub in
split_num' base (pred n) m (List.rev_append acc' acc)
let split_num n m =
let nums = split_num' n n (pred m) [] in
let lines =
List.rev_map begin fun lst ->
String.concat ", " (List.map string_of_int lst)
end nums
in
String.concat "\n" lines
let main () =
match Sys.argv with
| [|_; n; m|] ->
print_endline (split_num (int_of_string n) (int_of_string m))
| _ ->
print_endline "usage: command m n"
let () = if not !Sys.interactive then main ()
|




jijixi
#4344()
[
Scheme
]
Rating0/0=0.00
リストのネスト具合の辻褄合わせが大変だった。 静的型言語ならコンパイルするだけでチェックできるのに……
Rating0/0=0.00-0+
1 reply [ reply ]