Во-первых, я приношу извинения, если это запутанный или обратный способ сделать то, что я хочу сделать, но я новичок в «стиле OCaml».
Я хочу взять последний элемент списка и переместить его в начало списка, сдвинув все элементы вверх на один.
Например: иметь[1;2;3;4;5] -> [5;1;2;3;4]
Я понимаю, что списки в OCaml в основном представляют собой связанные списки, поэтому я планирую рекурсивно проходить по списку, находить последний элемент, а затем указывать последний/оставшийся список этого элемента на начало списка.
Что меня в основном смущает, так это то, как разорвать ссылку от предпоследнего элемента к последнему элементу. В приведенном выше примере я хочу, чтобы 5 указывало на 1, а 4 больше не указывало на 5.
Как мне это сделать, и есть ли более простой способ взглянуть на это, что я полностью отсутствует?
Решение проблемы
Вы не можете «разорвать связь», потому что списки Ocaml являются постоянной структурой данных. Вы не можете изменить списки, поэтому вам нужно создать новый список со значениями в том порядке, в котором вы хотите.
let thelist = [1;2;3;4;5] in
let lnewhead = List.hd (List.rev thelist) in
lnewhead:: (List.rev (List.tl (List.rev b)));;
Вы также можете определить это в функции:
let flipper = fun thelist ->
(List.hd (List.rev thelist)):: (List.rev (List.tl (List.rev thelist)));;
val flipper: 'a list -> 'a list = <fun>
# flipper([1;2;3;4;5]);;
-: int list = [5; 1; 2; 3; 4]
Комментариев нет:
Отправить комментарий