Сумма и количество чисел произвольного списка - Lisp (229300)
Формулировка задачи:
Дан список произвольной структуры, в который входят как числа, так и
символьные атомы. Написать функцию, которая возвращает список из двух
чисел, первое из них равно сумме чисел исходного списка, а второе их
количеству.
((1 A)(2 (3) B (4))) —> (10 4)
Ее я почти сделал, не получается проверить атом на число, в строке ((and (atom x) T) x) пишу вместо T (numberp x), но выдает ошибку, не могу никак понять в чем дело.
Листинг программы
- (defun fsum (x) //сумму считает в списке
- (cond
- ((null x) 0)
- ((and (atom x) T) x)
- (T (+ (fsum (car x)) (fsum (cdr x))))))
- (defun fkol (x) //количество атомов считает
- (cond
- ((null x) 0)
- ((and (atom x) T) 1)
- (T (+ (fkol (car x)) (fkol (cdr x))))))
- (defun f (x)
- (list (fsum x) (fkol x)))
Решение задачи: «Сумма и количество чисел произвольного списка»
textual
Листинг программы
- (defun fsum (x) //сумму считает в списке
- (cond
- ((null x) 0)
- ((numberp x) x)
- ((atom x) 0)
- (T (+ (fsum (car x)) (fsum (cdr x))))))
- (defun fkol (x) //количество атомов считает
- (cond
- ((null x) 0)
- ((atom x) 1)
- (T (+ (fkol (car x)) (fkol (cdr x))))))
- (defun f (x)
- (list (fsum x) (fkol x)))
Объяснение кода листинга программы
В коде представлено три функции:
- fsum — принимает один аргумент x и рекурсивно обходит каждый элемент списка, пока не встретит атом или null. Если элемент является числом, то он добавляется к сумме, если атом — то 0, если null — то 0.
- fkol — принимает один аргумент x и рекурсивно обходит каждый элемент списка, пока не встретит атом или null. Если элемент является атомом — то 1, если null — то 0.
- f — принимает один аргумент x и рекурсивно обходит каждый элемент списка, пока не встретит atom или null. Если элемент является числом, то он добавляется к сумме, если атом — то 0, если null — то 0. Вызов функции f(x) возвращает список из двух элементов: сумму и количество. Вот пример использования функций: (f (list(1, 2, 3, 4, 5))) Результат выполнения: (25, 5)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д