WikiDer > Добавить
В компьютерное программирование, добавить
это операция конкатенации связанные списки или массивы в некоторых языки программирования высокого уровня.
Лисп
Добавить
берет свое начало в Язык программирования Лисп. В добавить
процедура занимает ноль или больше (связанные) списки в качестве аргументов и возвращает объединение этих списков.
(добавить '(1 2 3) '(а б) '() '(6)); Выход: (1 2 3 a b 6)
Поскольку добавить
процедура должна полностью скопировать все свои аргументы, кроме последнего, оба ее временная и пространственная сложность находятся O (п) для списка элементы. Таким образом, при необдуманном использовании в коде это может стать источником неэффективности.
В nconc
процедура (называется добавить!
в Схема) выполняет ту же функцию, что и добавить
, но разрушительно: это изменяет CDR каждого аргумента (сохраните последний), указав его на следующий список.
Реализация
Добавить
можно легко определить рекурсивно с точки зрения минусы
. Ниже приводится простая реализация на схеме только для двух аргументов:
(определить добавить (лямбда (ls1 ls2) (если (значение NULL? ls1) ls2 (минусы (машина ls1) (добавить (CDR ls1) ls2)))))
Добавление можно также реализовать с помощью fold-right:
(определить добавить (лямбда (а б) (сгиб вправо минусы б а)))
Другие языки
После Лиспа другие языки высокого уровня какая особенность связанные списки как примитивный структуры данных приняли добавить
. Haskell использует ++
оператор для добавления списков. OCaml использует @
оператор для добавления списков.
Другие языки используют +
или ++
символы неразрушающего строка/ list / объединение массивов.
Пролог
В язык логического программирования Пролог имеет встроенный добавить
предикат, который можно реализовать следующим образом:
добавить([],Ys,Ys).добавить([Икс|Хз],Ys,[Икс|Zs]) :- добавить(Хз,Ys,Zs).
Этот предикат можно использовать для добавления, но также и для разделения списков. Вызов
?- добавить(L,р,[1,2,3]).
дает решения:
L = [], R = [1, 2, 3]; L = [1], R = [2, 3]; L = [1, 2], R = [3]; L = [1, 2, 3], R = []
Миранда
Это право-складыватьиз Hughes (1989: 5-6), имеет ту же семантику (например), что и реализация схемы выше, для двух аргументов.
добавить a b = уменьшить cons b a
Где сокращение - это имя Миранды складывать, и минусы создает список из двух значений или списков.
Например,
append [1,2] [3,4] = уменьшить cons [3,4] [1,2] = (уменьшить cons [3,4]) (cons 1 (cons 2 nil)) = cons 1 (cons 2 [ 3,4])) (заменяя cons на cons и nil на [3,4]) = [1,2,3,4]
Haskell
Это право-складывать имеет тот же эффект, что и реализация схемы выше:
добавить :: [а] -> [а] -> [а]добавить хз ys = складной (:) ys хз
По сути, это повторная реализация Haskell's ++
оператор.
Perl
В Perl, функция push эквивалентна методу добавления и может использоваться следующим образом.
мой @список;От себя @список, 1;От себя @список, 2, 3;
Конечным результатом является список, содержащий [1, 2, 3]
Функция unshift добавляет в начало списка, а не в конец
мой @список;не сдвигать @список, 1;не сдвигать @список, 2, 3;
Конечным результатом является список, содержащий [2, 3, 1]
При открытии файла используйте режим «>>» для добавления, а не перезаписи.
открыто(мой $ fh, '>>', "/some/file.txt");Распечатать $ fh "Какой-то новый текст";близко $ fh;
Обратите внимание, что при открытии и закрытии дескрипторов файлов всегда следует проверять возвращаемое значение.
Python
В Pythonиспользуйте метод списка "extend" или инфиксные операторы + и + = для добавления списков.
л = [1, 2]л.расширять([3, 4, 5])Распечатать л + [6, 7]
После выполнения этого кода l - это список, содержащий [1, 2, 3, 4, 5], а сгенерированный вывод - это список [1, 2, 3, 4, 5, 6, 7].
Не путайте с методом списка "append", который добавляет не замужем элемент в список:
л = [1, 2]л.добавить(3)
Здесь результатом является список, содержащий [1, 2, 3].
Баш
В Баш перенаправление добавления - это использование ">>" для добавления потока к чему-либо, как в следующей серии команд оболочки:
эхо Привет мир! > текст; эхо Прощай мир! >> текст; текст кошки
Стрим "Прощай, мир!" добавляется в текстовый файл, записанный в первой команде. Знак ";" подразумевает выполнение данных команд не одновременно. Итак, окончательное содержимое текстового файла:
Привет мир!
Прощай мир!
использованная литература
- Хьюз, Джон. 1989. Почему функциональное программирование имеет значение. Компьютерный журнал 32, 2, 98-107. https://web.archive.org/web/20070413005952/http://www.math.chalmers.se/~rjmh/Papers/whyfp.pdf
- Стил, Гай Л. мл. Common Lisp: Язык, второе издание. 1990. стр. 418, описание
добавить
.