OCaml: замена элементов в списке - PullRequest
3 голосов
/ 24 марта 2012

Мне интересно, как я могу написать функцию, которая делит заданный список на подсписки в заданной точке, меняет местами эти подсписки и возвращает результирующий список.

Например:

swap([1;3;5;6],2) => [5;6;1;3]

Полагаю, что разработанный мной код верен?

let rec swap (l,n) =
let rec loop t (count,laux)  =
            match t with
            |  h::t when count < n -> loop t (count+1, h::laux)
            |  h::t ->   h::t@  List.rev laux
            | []->[]
in
    loop l (0,[]) 

;;

1 Ответ

3 голосов
/ 24 марта 2012

Ты почти у цели. Проблема в том, что ваша функция обрабатывает случай, когда длина l больше или равна n неправильно.

Шаблон [] не означает, что входной список пуст; это означает, что мы подошли к концу списка. В этот момент вы должны вернуть аккумулятор acc в обратном порядке.

Я немного переставляю шаблоны, поэтому на первом месте стоят базовые случаи:

let rec swap (l, n) =
    let rec loop xs count acc =
            match xs with
            | _ when count = n -> xs @ List.rev acc
            | [] -> List.rev acc
            | h::t -> loop t (count+1) (h::acc)
     in loop l 0 []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...