Задание на использование рекурсии - Lisp

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

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

Напишите функцию, возвращающую Т, если одинаковые атомы расположены в списках x и y в одном и том же порядке, учитывая все атомы всех подсписков обоих списков. Например, результатом применения функции к аргументам ’(a 3 (4 b 7 c (4 d)) e) и ’((a 1 b) 9 (c d)) (e 8)) должен быть ’t.

Решение задачи: «Задание на использование рекурсии»

textual
Листинг программы
(defun flat (lst)
  (cond ((null lst) nil)
        ((atom (car lst)) (cons (car lst) (flat (cdr lst))))
        (t (append (flat (car lst)) (flat (cdr lst))))))
 
 
==> FLAT
(defun diff (lst1 lst2)
  (cond ((null lst1) nil)
        ((member (car lst1) lst2) (cons (car lst1) (diff (cdr lst1) lst2)))
        (t (diff (cdr lst1) lst2))))
 
 
==> DIFF
(defun task (lst1 lst2)
  (let ((s1 (flat lst1))
        (s2 (flat lst2)))
    (equal (diff s1 s2) (diff s2 s1))))
 
 
==> TASK
(task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c d) (e 8)))
 
 
==> T
 
(task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c e) (d 8)))
 
 
==> NIL

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

В коде дано три функции: flat, diff и task. Функция flat использует рекурсию для преобразования списка в одноплоскость. Функция diff использует рекурсию для нахождения разности между двумя списками. Функция task использует рекурсию для сравнения двух списков на равенство. Вот список элементов кода, оформленных в виде описания:

  1. flat:
    • Аргументы: lst
    • Описание: функция использует рекурсию для преобразования списка в одноплоскость
    • Рекурсивные вызовы: (car lst), (cdr lst)
    • Базовый случай: (null lst)
    • Шаблонный случай: (atom (car lst))
    • Повторяющийся случай: (t (append (flat (car lst)) (flat (cdr lst))))
  2. diff:
    • Аргументы: lst1 lst2
    • Описание: функция использует рекурсию для нахождения разности между двумя списками
    • Рекурсивные вызовы: (member (car lst1) lst2), (diff (cdr lst1) lst2)
    • Базовый случай: (null lst1)
    • Шаблонный случай: (member (car lst1) lst2)
    • Повторяющийся случай: (t (diff (cdr lst1) lst2))
  3. task:
    • Аргументы: lst1 lst2
    • Описание: функция использует рекурсию для сравнения двух списков на равенство
    • Рекурсивные вызовы: (diff s1 s2), (diff s2 s1)
    • Базовый случай: (null lst1)
    • Шаблонный случай: (member (car lst1) lst2)
    • Повторяющийся случай: (t (diff (cdr lst1) lst2)) Пример использования функций: (task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c e) (d 8))) -> NIL В этом примере функция task вызывает функцию flat для преобразования списков в одноплоскость, затем функцию diff для нахождения разности между двумя списками и, наконец, сравнивает результаты с помощью функции equal. Результатом является NIL, что означает, что списки равны.

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

9   голосов , оценка 3.889 из 5
Похожие ответы