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

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

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

Здравствуйте! Выполняю лабораторную по Lisp'у. Задание следующее:
Дан глобальный список ORDINE_ATOMI, который фиксирует порядок атомов. 1. Объявить функцию из 2х переменных (ORDINE atom1 atom2), где она истинна только тогда, когда атом1 следует перед атомом2 в списке ORDINE_ATOMI. 2. Объявить функцию 1 переменной (ORD_LISTA L), которая упорядочивает элементы из списка L согласно порядку в списке ORDINE_ATOMI.
По первому пункту написала следующее:
Листинг программы
  1. (setq *ORDINE_ATOMI* '(1 2 3 4 5 6 7 8 9))
  2. (defun pos_num (x lst &optional (pos 0))
  3. (cond
  4. ((eql x (car lst)) pos)
  5. (t (pos_num x (cdr lst) (1+ pos)))))
  6. (defun ORDINE (x y)
  7. (cond
  8. ((> (pos_num x ORDINE_ATOMI) (pos_num y ORDINE_ATOMI)) "FALSE")
  9. (t "TRUE")))
Т.е. Нахожу позицию одного элемента, другого элемента, сравниваю эти позиции. Синтаксис учу только 2ую неделю, в основном, есть догадки, каким образом можно было бы реализовать программу, но знаний синтаксиса не хватает, приходится выкручиваться... Если есть другие идеи, поделитесь пожалуйста.

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

textual
Листинг программы
  1. (setq *ordlist* '(a b c d e f))
  2.  
  3. ==> (A B C D E F)
  4. ;; Создана глобальная переменная *ordlist*
  5.  
  6. (defun ordin (a1 a2 alst &optional (p1 nil) (p2 nil))
  7.   (cond ((null alst) nil)
  8.         ((eq (car alst) a1) (if p2 nil (ordin a1 a2 (cdr alst) t p2)))
  9.         ((eq (car alst) a2) (if p1 t nil))
  10.         (t (ordin a1 a2 (cdr alst) p1 p2))))
  11.  
  12. ==> ORDIN
  13.  
  14. (defun asort (lst)
  15.   (cond ((null lst) nil)
  16.         (t (let ((z (car lst)))
  17.              (append (asort (remove-if-not (lambda (x) (ordin x z *ordlist*)) (cdr lst)))
  18.                      (list z)
  19.                      (asort (remove-if (lambda (x) (ordin x z *ordlist*)) (cdr lst))))))))
  20.  
  21. ==> ASORT
  22.  
  23. (asort '(a f b c c c a a b f f a))
  24.  
  25. ==> (A A A A B B C C C F F F)

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

  1. Создана глобальная переменная ordlist со значением '(a b c d e f).
  2. Определена функция ordin с тремя аргументами a1, a2, alst и двумя опциональными аргументами p1 и p2, которые по умолчанию равны nil.
  3. Если alst равно nil, то функция возвращает nil.
  4. Если (car alst) равно a1, то выполняется рекурсивный вызов функции ordin с аргументами a1, a2, (cdr alst) и (p1, p2), причем значение p2 изменяется на t, если p1 не равно nil.
  5. Если (car alst) равно a2, то значение p1 устанавливается в t, если p1 не равно nil.
  6. В противном случае выполняется рекурсивный вызов функции ordin с аргументами a1, a2, (cdr alst), (p1, p2).
  7. Определена функция asort с одним аргументом lst.
  8. Если lst равно nil, то функция возвращает nil.
  9. В противном случае выполняется вызов функции ordin с аргументами (car lst), (cdr lst), ordlist.
  10. Выполняется рекурсивный вызов функции asort с аргументом (remove-if-not (lambda (x) (ordin x (car lst) ordlist)) (cdr lst)).
  11. К результату рекурсивного вызова функции asort добавляется (car lst).
  12. К результату рекурсивного вызова функции asort добавляется (asort (remove-if (lambda (x) (ordin x (car lst) ordlist)) (cdr lst)).
  13. Выполняется вызов функции asort с аргументом '(a f b c c a a b f f a)).
  14. Результатом является '(A A A A B B C C C F F F).

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


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

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

15   голосов , оценка 4.267 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут