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

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

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

необходимо реализовать задачу 2 вариантами: 1.с помощью рекурсии 2.с помощью циклов. Определить функцию, осуществляющую несколько замен х на у в исходном списке по ассоциативному списку: ((x1.y1)(x2.y2)(x3.y3).....)

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

textual
Листинг программы
  1. ;; рекурсивная версия
  2.  
  3. (defun to-repl-r (x asso-list)
  4.   (cond ((null asso-list) x)
  5.         ((eq x (caar asso-list)) (cdar asso-list))
  6.         (t (to-repl-r x (cdr asso-list)))))  
  7.  
  8. ==> TO-REPL-R
  9.  
  10. (to-repl-r 'x '((z . 1) (x . 2) (y . 3)))
  11.  
  12. ==> 2
  13.  
  14. (to-repl-r 'r '((z . 1) (x . 2) (y . 3)))
  15.  
  16. ==> R
  17.  
  18. ;; Циклическая версия
  19.  
  20. (defun to-repl-l (x asso-list)
  21.    (dolist (a asso-list x)
  22.      (when (eq (car a) x) (return (cdr a)))))
  23.  
  24. ==> TO-REPL-L
  25.  
  26. (to-repl-l 'r '((z . 1) (x . 2) (y . 3)))
  27.  
  28. ==> R
  29.  
  30. (to-repl-l 'y '((z . 1) (x . 2) (y . 3)))
  31.  
  32. ==> 3

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

В коде представлено два варианта реализации замены символа в ассоциативном списке: рекурсивная и циклическая.

  1. Рекурсивная версия:
    • (defun to-repl-r (x asso-list) (cond ((null asso-list) x) ((eq x (caar asso-list)) (cdar asso-list)) (t (to-repl-r x (cdr asso-list))))) В этом варианте реализована рекурсивная функция to-repl-r, которая принимает два аргумента: x и asso-list. x - символ, который необходимо заменить, а asso-list - ассоциативный список, в котором производится замена. Функция работает следующим образом:
  2. Если asso-list равен nil, то возвращается x, так как замена не может быть выполнена.
  3. Если x равен car из asso-list, то возвращается cdar из asso-list, так как замена выполнена.
  4. Если условие не выполняется, то рекурсивно вызывается to-repl-r с аргументами x и cdr из asso-list.
  5. Циклическая версия:
    • (defun to-repl-l (x asso-list) (dolist (a asso-list x) (when (eq (car a) x) (return (cdr a))))) В этом варианте реализована циклическая функция to-repl-l, которая также принимает два аргумента: x и asso-list. Функция работает следующим образом:
  6. С помощью цикла dolist перебираются элементы asso-list.
  7. Если car текущего элемента равен x, то возвращается cdr текущего элемента, так как замена выполнена. Пример использования функций:
    • (to-repl-r 'x '((z . 1) (x . 2) (y . 3))) -> 2
    • (to-repl-r 'r '((z . 1) (x . 2) (y . 3))) -> R
    • (to-repl-l 'y '((z . 1) (x . 2) (y . 3))) -> 3

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


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

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

8   голосов , оценка 4.25 из 5

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

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

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