Добавить
В компьютерном программировании , append
— это операция объединения связанных списков или массивов в некоторых языках программирования высокого уровня .
Лисп
[ редактировать ]Append
берет свое начало от языка программирования Lisp . append
Процедура принимает ноль или более (связанных) списков в качестве аргументов и возвращает объединение этих списков.
(append '(1 2 3) '(a b) '() '(6))
;Output: (1 2 3 a b 6)
Поскольку append
Процедура должна полностью скопировать все свои аргументы, кроме последнего, ее временная и пространственная сложность равна O( n ) для списка элементы. Таким образом, это может стать источником неэффективности, если неразумно использоваться в коде.
The nconc
процедура (называемая append!
в схеме ) выполняет ту же функцию, что и append
, но деструктивно : он изменяет cdr каждого аргумента (сохраняя последний), указывая его на следующий список.
Выполнение
[ редактировать ]Append
можно легко определить рекурсивно в терминах cons
. Ниже приведена простая реализация в Scheme, только для двух аргументов:
(define append
(lambda (ls1 ls2)
(if (null? ls1)
ls2
(cons (car ls1) (append (cdr ls1) ls2)))))
Добавление также можно реализовать с помощью Fold-Right:
(define append
(lambda (a b)
(fold-right cons b a)))
Другие языки
[ редактировать ]Вслед за Лиспом другие языки программирования высокого уровня , в которых связные списки представляют собой примитивные структуры данных , приняли append
. Для добавления списков в оператора Haskell качестве использует ++
, OCaml использует @
.
В других языках используется +
или ++
символы для неразрушающего объединения строки , списка или массива.
Пролог
[ редактировать ]Язык логического программирования имеет Пролог встроенный append
предикат, который можно реализовать следующим образом:
append([],Ys,Ys).
append([X|Xs],Ys,[X|Zs]) :-
append(Xs,Ys,Zs).
Этот предикат можно использовать для добавления, а также для разделения списков. Вызов
?- append(L,R,[1,2,3]).
дает решения:
L = [], R = [1, 2, 3] ; L = [1], R = [2, 3] ; L = [1, 2], R = [3] ; L = [1, 2, 3], R = []
Миранда
[ редактировать ]В Миранде этот правый сгиб из Хьюза (1989:5-6) имеет ту же семантику (по примеру), что и реализация Scheme выше, для двух аргументов.
append a b = reduce cons b a
Где сокращение — это имя Миранды для сгиба , а cons создает список из двух значений или списков.
Например,
append [1,2] [3,4] = reduce cons [3,4] [1,2] = (reduce cons [3,4]) (cons 1 (cons 2 nil)) = cons 1 (cons 2 [3,4])) (replacing cons by cons and nil by [3,4]) = [1,2,3,4]
Хаскелл
[ редактировать ]В Haskell этот правый сгиб имеет тот же эффект, что и реализация Scheme выше:
append :: [a] -> [a] -> [a]
append xs ys = foldr (:) ys xs
По сути, это повторная реализация языка Haskell. ++
оператор.
Перл
[ редактировать ]В Perl функция push эквивалентна методу добавления и может использоваться следующим образом.
my @list;
push @list, 1;
push @list, 2, 3;
Конечным результатом является список, содержащий [1, 2, 3]
Функция unshift добавляется в начало списка, а не в конец.
my @list;
unshift @list, 1;
unshift @list, 2, 3;
Конечным результатом является список, содержащий [2, 3, 1]
При открытии файла используйте режим «>>» для добавления, а не для перезаписи.
open(my $fh, '>>', "/some/file.txt");
print $fh "Some new text\n";
close $fh;
Обратите внимание, что при открытии и закрытии дескрипторов файлов всегда следует проверять возвращаемое значение.
Питон
[ редактировать ]В Python используйте метод списка extend
или инфиксные операторы +
и +=
для добавления списков.
>>> l = [1, 2]
>>> l.extend([3, 4, 5])
>>> l
[1, 2, 3, 4, 5]
>>> l + [6, 7]
[1, 2, 3, 4, 5, 6, 7]
Не путайте с методом списка. append
, который добавляет один в список элемент:
>>> l = [1, 2]
>>> l.append(3)
>>> l
[1, 2, 3]
Баш
[ редактировать ]В Bash перенаправление добавления — это использование «>>» для добавления потока к чему-либо, как в следующей серии команд оболочки:
echo Hello world! >text; echo Goodbye world! >>text; cat text
Трансляция «Прощай, мир!» добавляется в текстовый файл, записанный в первой команде. ";" подразумевает выполнение данных команд по порядку, а не одновременно. Итак, окончательное содержимое текстового файла:
Hello world!
Goodbye world!
Ссылки
[ редактировать ]- Хьюз, Джон (1989). «Почему функциональное программирование важно» (PDF) . Компьютерный журнал . 32 (2): 98–107. дои : 10.1093/comjnl/32.2.98 . Архивировано из оригинала (PDF) 13 апреля 2007 г.
- Стил, Гай Л. младший (1990). « Common Lisp : The Language» (2-е изд.): 418.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) Описаниеappend
.