2015-04-05 69 views
0

有着名的练习以螺旋方式打印矩阵(表示为向量矢量),我想在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中我下面旋转向量后执行以下操作:如果在OCaml中类似的东西

(reverse (apply map vector [[8 9 4] [7 6 5]])) 
([4 5] [9 6] [8 7]) 

我想知道。我发现List.map,但不知道其余的。我应该只是实现从每个子向量中读取最后一个元素的东西吗?

回答

4

这里是一个可能实现旋转功能:

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]] 
+0

谢谢!这就是它。 – Istvan 2015-04-05 04:02:53