Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.14 KB | None | 0 0
  1. ; Дан смешанный, структурированный список (т.е. любой элемент списка может быть: символ, число или список).
  2.  
  3. ; Найти сумму четных чисел на всех уровнях заданного списка, лежащих в заданном интервале [a, b].
  4.  
  5. ; Добавить найденную сумму к исходному списку, в качестве К-ого элемента верхнего уровня или в конец. Если чисел нет, сообщить об этом.
  6.  
  7.  
  8. ; проверка элемента на четность
  9. (defun is-odd(elem)
  10.     (eq (mod elem 2) 0)  ; проверка на четность
  11. )
  12.  
  13. (is-odd 6)   ;-> T
  14. (is-odd 7)   ;-> NIL
  15.  
  16. ; проверяет принадлежность элемента границам
  17. (defun elem-in (lb rb elem)
  18.     (and (>= elem lb) (<= elem rb))
  19. )
  20.  
  21. (elem-in 10 20 5)
  22. (elem-in 10 20 15)
  23.  
  24.  
  25. ; добавляет число если оно в границах и четное
  26. (defun check-elem(lb rb elem)
  27.     (cond
  28.         ((and (is-odd elem) (elem-in lb rb elem)) elem)
  29.         (t 0)
  30.     )
  31. )
  32.  
  33. (check-elem 5 20 6) ;->0
  34. (check-elem 5 20 7) ;->
  35.  
  36. ; главная функция программы
  37. (defun odd-sum (lb rb list)
  38.     (reduce
  39.         (lambda (sum elem)
  40.             (cond
  41.                 ((null elem) sum)
  42.                 ((numberp elem)  (+ (check-elem lb rb elem) sum)) ; если элемент - четное число, добавить к сумме
  43.                 ((listp elem)    (+ (odd-sum lb rb elem) sum)) ; если элемент список - применить на нем функцию
  44.                 (t sum)
  45.             )
  46.         ) list :initial-value 0
  47.     )
  48. )
  49.  
  50. ; добавляет сумму в конец списка
  51. (defun add-odd-sum-to-end (lb rb list)
  52.     (reduce
  53.         (lambda (elem result-list)
  54.             (cons elem result-list)
  55.         ) list :initial-value (cons (odd-sum lb rb list) nil) :from-end t
  56.     )
  57. )
  58.  
  59. ; (ADD-ODD-SUM-TO-END 2 7 '(1 2 4 5 7 10)) ; -> (1 2 4 5 7 10 6)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement