Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Ocaml] Работа со списками, [Ocaml] Работа со списками 
:(
    Опции темы
ywaw
Дата 4.7.2011, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.7.2011

Репутация: нет
Всего: нет



На днях начал изучать Ocaml. Подскажите как получить значение к произвольного элемента списка, удалить произвольный
элемент списка или вставить новый элемент в  произвольную позицию. Это возможно?
PM MAIL   Вверх
Void
Дата 5.7.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Возможно, только с линейной сложностью, как и полагается для односвязного списка.
Цитата(ywaw @  4.7.2011,  10:24 Найти цитируемый пост)
получить значение к произвольного элемента списка

List.nth
Цитата(ywaw @  4.7.2011,  10:24 Найти цитируемый пост)
удалить произвольный элемент списка или вставить новый элемент в  произвольную позицию.

Введём сначала вспомогательную функцию:
Код
let split_at lst n =
    let rec loop lst acc = function
        | 0 -> List.rev acc, lst
        | i -> match lst with
            | (x :: xs) -> loop xs (x :: acc) (i - 1)
            | [] -> failwith "split_at"
    in loop lst [] n

А потом:
Код
let remove_at lst n =
    let (head, tail) = split_at lst n in
    match tail with
    | [] -> failwith "remove_at"
    | x :: xs -> head @ xs

let insert_at lst n elt =
    let (head, tail) = split_at lst n in
    head @ [elt] @ tail



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ywaw
Дата 6.7.2011, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.7.2011

Репутация: нет
Всего: нет



Цитата(Void @ 5.7.2011,  20:04)
Возможно, только с линейной сложностью, как и полагается для односвязного списка.
Цитата(ywaw @  4.7.2011,  10:24 Найти цитируемый пост)
получить значение к произвольного элемента списка

List.nth
Цитата(ywaw @  4.7.2011,  10:24 Найти цитируемый пост)
удалить произвольный элемент списка или вставить новый элемент в  произвольную позицию.

Введём сначала вспомогательную функцию:
Код
let split_at lst n =
    let rec loop lst acc = function
        | 0 -> List.rev acc, lst
        | i -> match lst with
            | (x :: xs) -> loop xs (x :: acc) (i - 1)
            | [] -> failwith "split_at"
    in loop lst [] n

А потом:
Код
let remove_at lst n =
    let (head, tail) = split_at lst n in
    match tail with
    | [] -> failwith "remove_at"
    | x :: xs -> head @ xs

let insert_at lst n elt =
    let (head, tail) = split_at lst n in
    head @ [elt] @ tail

Спасибо за код. Буду тестировать на скорость. Вопрос не праздный, т.к. пишу логическую игру Таблут.
Ранее писал на с#, а прототипы на питоне - если интересно - загляните на страничку chess-11.narod.ru\
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.