Работа со списками - Lisp (229429)

Узнай цену своей работы

Формулировка задачи:

Организовать список, который будет содержать подсписки: имена столбцов и все остальные - значения строк. Требуется реализовать функции добавления,вставки и удаления. Добавление в конец; Вставка в указанную позицию; Удаление по номеру.
(list '(name1 name2) 
'(1 2) 
'(3 4))
Нужно,чтобы список имел вид "таблицы"(рисунок приложен). Не очень понятно, как это реализовывается. Что касается удаления по номеру:
(defun del (n l) 
    (cond 
    ((null l) nil) 
    ( (not(atom (car l))) ( cons (del n (car l)) (del (- n (length (car l))) (cdr l))) ) 
    ((<= n 1) (del (- n 1) (cdr l)) ) 
    (t (cons (car l) (del (- n 1) (cdr l)))) 
    ) 
)

Решение задачи: «Работа со списками»

textual
Листинг программы
(defun ins-after-row (matr row n)
  (cond ((= n 0) (cons (car matr) (cons row (cdr matr))))
        (t (cons (car matr) (ins-after-row (cdr matr) row (- n 1))))))
 
==> ins-after-row
 
(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 2)
 
==> ((name-1 name-2 name-3) (1 2 3) (4 5 6) (x y z) (7 8 9) (a b c))
 
(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 1)
 
==> ((name-1 name-2 name-3) (1 2 3) (x y z) (4 5 6) (7 8 9) (a b c))
 
(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 0)
 
==> ((name-1 name-2 name-3) (x y z) (1 2 3) (4 5 6) (7 8 9) (a b c))

Объяснение кода листинга программы

Функция ins-after-row принимает три аргумента:

  1. matr - список, в который нужно вставить новый элемент.
  2. row - элемент, который нужно вставить.
  3. n - номер элемента, после которого нужно вставить row. Если n равно 0, то функция возвращает новый список, в котором row добавлена в начало matr. Если n больше 0, то функция рекурсивно вызывает саму себя, пока не достигнет n равным 0, и добавляет row после соответствующего элемента. Вот примеры вызовов функции ins-after-row:
  4. (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 2) В этом примере функция ins-after-row будет вызвана с аргументами matr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)), row = '(x y z) и n = 2. Поскольку n больше 0, функция рекурсивно вызывает саму себя с аргументами cdr matr = '(4 5 6) и n = (- n 1) = 1. Затем функция возвращает новый список ((name-1 name-2 name-3) (1 2 3) (x y z) (4 5 6) (7 8 9) (a b c)).
  5. (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 1) В этом примере функция ins-after-row будет вызвана с аргументами matr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)), row = '(x y z) и n = 1. Поскольку n больше 0, функция рекурсивно вызывает саму себя с аргументами cdr matr = '(4 5 6) и n = (- n 1) = 0. Затем функция возвращает новый список ((name-1 name-2 name-3) (x y z) (4 5 6) (7 8 9) (a b c)).
  6. (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 0) В этом примере функция ins-after-row будет вызвана с аргументами matr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)), row = '(x y z) и n = 0. Поскольку n равно 0, функция возвращает новый список ((name-1 name-2 name-3) (x y z) (1 2 3) (4 5 6) (7 8 9) (a b c)).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5