Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Дан смешанный, структурированный список (т.е. любой элемент списка может быть: символ, число или список).
- ; Найти сумму четных чисел на всех уровнях заданного списка, лежащих в заданном интервале [a, b].
- ; Добавить найденную сумму к исходному списку, в качестве К-ого элемента верхнего уровня или в конец. Если чисел нет, сообщить об этом.
- ; проверка элемента на четность
- (defun is-odd(elem)
- (eq (mod elem 2) 0) ; проверка на четность
- )
- (is-odd 6) ;-> T
- (is-odd 7) ;-> NIL
- ; проверяет принадлежность элемента границам
- (defun elem-in (lb rb elem)
- (and (>= elem lb) (<= elem rb))
- )
- (elem-in 10 20 5)
- (elem-in 10 20 15)
- ; добавляет число если оно в границах и четное
- (defun check-elem(lb rb elem)
- (cond
- ((and (is-odd elem) (elem-in lb rb elem)) elem)
- (t 0)
- )
- )
- (check-elem 5 20 6) ;->0
- (check-elem 5 20 7) ;->
- ; главная функция программы
- (defun odd-sum (lb rb list)
- (reduce
- (lambda (sum elem)
- (cond
- ((null elem) sum)
- ((numberp elem) (+ (check-elem lb rb elem) sum)) ; если элемент - четное число, добавить к сумме
- ((listp elem) (+ (odd-sum lb rb elem) sum)) ; если элемент список - применить на нем функцию
- (t sum)
- )
- ) list :initial-value 0
- )
- )
- ; добавляет сумму в конец списка
- (defun add-odd-sum-to-end (lb rb list)
- (reduce
- (lambda (elem result-list)
- (cons elem result-list)
- ) list :initial-value (cons (odd-sum lb rb list) nil) :from-end t
- )
- )
- ; (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