2010-10-21 2 views
6

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

Но я не могу обобщить. Я, конечно, думаю не в том направлении. Разве это обобщаемо? Есть ли лучшее решение? Пожалуйста помоги.

ответ

10
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, Wow! Я не знал о функции List.map. В руководстве говорится, что он не является хвостовым рекурсивным. Какое влияние это может иметь, если я использую это в более крупном коде? – lalli

+1

@lalli: для очень больших списков это может привести к переполнению стека. В этом случае вы должны использовать 'List.rev_map' вместо этого, а затем пройти через списки в конце и отменить их. Однако обратите внимание, что мое определение 'transpose' также не является хвостовым рекурсивным (и не является вашим). – sepp2k

+4

Вы не должны беспокоиться о хвостовой рекурсии сначала; попробуйте сделать простую и ясную реализацию. Использование функции «транспонирования» («список списков») с очень большими списками - это, вероятно, очень плохая идея. Если у вас много данных, то, вероятно, более подходящей является другая структура данных (например, индексированная матрицей (int * int), которая имеет функцию «транспонирование» с постоянным временем). – gasche

Смежные вопросы