当前位置:  开发笔记 > 程序员 > 正文

转置列表清单

如何解决《转置列表清单》经验,为你挑选了1个好方法。

我试图做一个递归函数来获取一个列表的列表的转置n x pp 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)

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



1> sepp2k..:
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)


你最初不应该担心尾递归; 尝试简单明了的实现.无论如何,在('列表列表)上使用具有非常大的列表的"转置"功能可能是一个非常糟糕的主意.如果你有很多数据,那么另一个数据结构(例如,由(int*int)索引的矩阵,其具有恒定时间`transpose`函数)可能更合适.
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有