OCaml 中的螺旋打印
Spiral print in OCaml
有一个以螺旋方式打印矩阵(表示为向量的向量)的著名练习,我想在 OCaml 中进行。
给定以下矩阵,它应该打印 1 2 3 4 5 6 7 8 9
[ [1 2 3]
[8 9 4]
[7 6 5] ]
优雅的实现将第一个子向量添加到累加器,并使用旋转后的剩余数字递归调用该函数。
旋转后的剩余部分在第一次迭代后看起来如下
[ [4 5]
[9 6]
[8 7] ]
在 Clojure 中,我执行以下操作来旋转向量:
(reverse (apply map vector [[8 9 4] [7 6 5]]))
([4 5] [9 6] [8 7])
我想知道 OCaml 中是否有类似的东西。我找到了 List.map 但不确定其余部分。我应该只实现从每个子向量中读取最后一个元素的东西吗?
这里是旋转函数的一个可能实现:
let rotate ll =
let cons x y = x :: y in
let init = List.map (fun _ -> []) (List.hd ll) in
let rres = List.fold_right (List.map2 cons) ll init in
List.rev rres
这是一个示例会话:
$ ocaml
OCaml version 4.01.0
# #use "rot.ml";;
val rotate : 'a list list -> 'a list list = <fun>
# rotate [[8; 9; 4]; [7; 6; 5]];;
- : int list list = [[4; 5]; [9; 6]; [8; 7]]
有一个以螺旋方式打印矩阵(表示为向量的向量)的著名练习,我想在 OCaml 中进行。
给定以下矩阵,它应该打印 1 2 3 4 5 6 7 8 9
[ [1 2 3]
[8 9 4]
[7 6 5] ]
优雅的实现将第一个子向量添加到累加器,并使用旋转后的剩余数字递归调用该函数。
旋转后的剩余部分在第一次迭代后看起来如下
[ [4 5]
[9 6]
[8 7] ]
在 Clojure 中,我执行以下操作来旋转向量:
(reverse (apply map vector [[8 9 4] [7 6 5]]))
([4 5] [9 6] [8 7])
我想知道 OCaml 中是否有类似的东西。我找到了 List.map 但不确定其余部分。我应该只实现从每个子向量中读取最后一个元素的东西吗?
这里是旋转函数的一个可能实现:
let rotate ll =
let cons x y = x :: y in
let init = List.map (fun _ -> []) (List.hd ll) in
let rres = List.fold_right (List.map2 cons) ll init in
List.rev rres
这是一个示例会话:
$ ocaml
OCaml version 4.01.0
# #use "rot.ml";;
val rotate : 'a list list -> 'a list list = <fun>
# rotate [[8; 9; 4]; [7; 6; 5]];;
- : int list list = [[4; 5]; [9; 6]; [8; 7]]