Если бы задача состояла в том, чтобы просто чередовать элементы, пока все списки не станут пустыми, это было бы довольно просто; просто поворачивайте списки, добавляя по одному элементу за раз, пока все они не станут пустыми.
let rec interleave3 xs ys zs =
match xs, ys, zs with
| [], [], [] -> []
| [], ys, zs -> "-" :: interleave3 ys zs []
| x::xs, ys, zs -> x :: interleave3 ys zs xs
Однако, поскольку требование состоит в том, что каждый список должен быть эффективно дополнен до равной длины, нам нужно каким-то образом отслеживать длину самого длинного списка и продолжать дополнять результирующий список до тех пор, пока не будет заполнен весь список. Один из способов сделать это — сохранить общий подсчет и продолжить работу даже после того, как мы закончим, пока общее количество не будет делиться на 3, после чего мы знаем, что результирующий список имеет равное количество элементов:
let interleave3 xs ys zs =
let rec aux xs ys zs n =
match xs, ys, zs with
| [], [], [] when n mod 3 = 0 -> []
| [], [], [] -> "-" :: aux [] [] [] (n+1)
| [], ys, zs -> "-" :: aux ys zs [] (n+1)
| x::xs, ys, zs -> x :: aux ys zs xs (n+1)
in aux xs ys zs 0
person
glennsl
schedule
30.10.2017