Вычислить сумму числовых элементов списка, учитывая элементы подсписков - Lisp

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

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

Доброго времени суток! Задача состоит в следующем: Вычислить сумму числовых элементов списка, учитывая элементы подсписков. Вот мой код.
(defun soe (lst)
 (cond
((null lst) 0)
(( and (atom lst) (numberp lst)) lst)
(t (+ 
(soe (car lst))
(soe (cdr lst)))
)))
В результате вызова функции выдает следующее:
 > 
(soe '( 2 3 f ( 2 g ) 2))
 
Error: Cannot take CAR of F.

Решение задачи: «Вычислить сумму числовых элементов списка, учитывая элементы подсписков»

textual
Листинг программы
;; просто рекурсия 
 
(defun sum-num (lst)
  (cond ((null lst) 0)
        ((listp (car lst)) (+ (sum-num (car lst)) (sum-num (cdr lst))))
        ((numberp (car lst)) (+ (car lst) (sum-num (cdr lst))))
        (t (sum-num (cdr lst)))))
 
 
==> SUM-NUM
 
(sum-num '(1 2 3 a b (((c))) (((7 8)))))
 
==> 21
 
;; итерации + рекурсия
 
(defun sum-num (lst)
  (let ((s 0))
    (dolist (a lst s)
      (cond ((listp a) (setf s (+ s (sum-num a))))
            ((numberp a) (setf s (+ s a)))))))
              
 
==> SUM-NUM
 
(sum-num '(1 2 3 a b (((c))) (((7 8)))))
 
==> 21
 
;; функционалы + рекурсия
 
(defun sum-num (lst)
  (apply '+ (mapcar (lambda (x)
                      (cond ((listp x) (sum-num x))
                            ((numberp x) x)
                            (t 0))) lst))) 
 
==> SUM-NUM
 
(sum-num '(1 2 3 a b (((c))) (((7 8)))))
 
==> 21

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

В коде представлено три варианта вычисления суммы числовых элементов списка, учитывая элементы подсписков.

  1. Просто рекурсивный вариант:
    • Функция sum-num принимает список lst в качестве входного параметра.
    • Если lst является nil, то возвращается 0.
    • Если car lst является списком, то рекурсивно вызывается sum-num для car lst и cdr lst.
    • Если car lst является числом, то car lst добавляется к результату рекурсивного вызова sum-num для cdr lst.
    • В остальных случаях, результат рекурсивного вызова sum-num для cdr lst возвращается.
  2. Вариант с использованием итераций и рекурсии:
    • Функция sum-num принимает список lst в качестве входного параметра.
    • Создается переменная s со значением 0.
    • Используется dolist для итерации по элементам lst.
    • Если элемент a является списком, то рекурсивно вызывается sum-num для a и результат добавляется к s.
    • Если элемент a является числом, то a добавляется к s.
    • В остальных случаях, s возвращается.
  3. Вариант с использованием функционалов и рекурсии:
    • Функция sum-num принимает список lst в качестве входного параметра.
    • Используется apply для применения функции + к результатам mapcar.
    • mapcar применяется к элементам lst с использованием лямбда-функции, которая рекурсивно вызывает sum-num для списков и возвращает числовые значения для чисел.
    • Если элемент x является списком, то рекурсивно вызывается sum-num для x.
    • Если элемент x является числом, то x возвращается.
    • В остальных случаях, возвращается 0.

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


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

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

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