转置列表清单

时间:2010-10-21 16:35:43

标签: ocaml

我正在尝试创建一个递归函数来将列表列表n x p转置为p x n。但我无法这样做。我已经能够将3 x n列表列表转换为n x 3列表:

let rec drop1 list=
    [(match (List.nth list 0) with [] -> [] | a::b -> b);
     (match (List.nth list 1) with [] -> [] | a::b -> b);
     (match (List.nth list 2) with [] -> [] | a::b -> b);]

let rec transpose list=
    if List.length (List.nth list 0) == 0 then []
    else [(match (List.nth list 0) with [] -> 0 | a::b -> a);
          (match (List.nth list 1) with [] -> 0 | a::b -> a);
          (match (List.nth list 2) with [] -> 0 | a::b -> a)]
         :: transpose (drop1 list)

但我无法概括它。我肯定在想错误的方向。这可以推广吗?有更好的解决方案吗?请帮忙。

2 个答案:

答案 0 :(得分:11)

let rec transpose list = match list with
| []             -> []
| []   :: xss    -> transpose xss
| (x::xs) :: xss ->
    (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss)

答案 1 :(得分:1)

我知道这是一个古老的问题,但是最近我不得不做一个练习来解决这个问题,遇到了@ sepp2k的解决方案,但是我不明白它是如何工作的,所以我尝试着由我自己。

这本质上是相同的算法,但是更简洁一些,因为它不会破坏列表的结构。我以为我可以将其发布在这里,以防其他人在搜索,并且可能会发现这种表达方式很有用:

let rec transpose = function
   | [] 
   | [] :: _ -> []
   | rows    -> 
       List.map List.hd rows :: transpose (List.map List.tl rows)