транспонировать список списков - PullRequest
7 голосов
/ 21 октября 2010

Я пытаюсь создать рекурсивную функцию для получения транспонирования списка списков, от 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 ]

11 голосов
/ 21 октября 2010
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 голос
/ 14 июня 2019

Я знаю, что это старый вопрос, но недавно мне пришлось решить его как часть упражнения, которое я делал, и я наткнулся на решение @ sepp2k, но я не мог понять, как оно работает, поэтому я попытался прийтина это сам.

По сути, это тот же алгоритм, но немного более краткий, поскольку он не разрушает список списков.Я подумал, что опубликую это здесь, если кто-то другой ищет, и может найти способ выразить это полезным:

let rec transpose = function
   | [] 
   | [] :: _ -> []
   | rows    -> 
       List.map List.hd rows :: transpose (List.map List.tl rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...