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)
Но я не могу обобщить. Я, конечно, думаю не в том направлении. Разве это обобщаемо? Есть ли лучшее решение? Пожалуйста помоги.
+1, Wow! Я не знал о функции List.map. В руководстве говорится, что он не является хвостовым рекурсивным. Какое влияние это может иметь, если я использую это в более крупном коде? – lalli
@lalli: для очень больших списков это может привести к переполнению стека. В этом случае вы должны использовать 'List.rev_map' вместо этого, а затем пройти через списки в конце и отменить их. Однако обратите внимание, что мое определение 'transpose' также не является хвостовым рекурсивным (и не является вашим). – sepp2k
Вы не должны беспокоиться о хвостовой рекурсии сначала; попробуйте сделать простую и ясную реализацию. Использование функции «транспонирования» («список списков») с очень большими списками - это, вероятно, очень плохая идея. Если у вас много данных, то, вероятно, более подходящей является другая структура данных (например, индексированная матрицей (int * int), которая имеет функцию «транспонирование» с постоянным временем). – gasche