我正在尝试创建一个递归函数来将列表列表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)
但我无法概括它。我肯定在想错误的方向。这可以推广吗?有更好的解决方案吗?请帮忙。
答案 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)