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

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

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

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

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

textual
Листинг программы
  1. ;; просто рекурсия
  2.  
  3. (defun sum-num (lst)
  4.   (cond ((null lst) 0)
  5.         ((listp (car lst)) (+ (sum-num (car lst)) (sum-num (cdr lst))))
  6.         ((numberp (car lst)) (+ (car lst) (sum-num (cdr lst))))
  7.         (t (sum-num (cdr lst)))))
  8.  
  9.  
  10. ==> SUM-NUM
  11.  
  12. (sum-num '(1 2 3 a b (((c))) (((7 8)))))
  13.  
  14. ==> 21
  15.  
  16. ;; итерации + рекурсия
  17.  
  18. (defun sum-num (lst)
  19.   (let ((s 0))
  20.     (dolist (a lst s)
  21.       (cond ((listp a) (setf s (+ s (sum-num a))))
  22.             ((numberp a) (setf s (+ s a)))))))
  23.              
  24.  
  25. ==> SUM-NUM
  26.  
  27. (sum-num '(1 2 3 a b (((c))) (((7 8)))))
  28.  
  29. ==> 21
  30.  
  31. ;; функционалы + рекурсия
  32.  
  33. (defun sum-num (lst)
  34.   (apply '+ (mapcar (lambda (x)
  35.                       (cond ((listp x) (sum-num x))
  36.                             ((numberp x) x)
  37.                             (t 0))) lst)))
  38.  
  39. ==> SUM-NUM
  40.  
  41. (sum-num '(1 2 3 a b (((c))) (((7 8)))))
  42.  
  43. ==> 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

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

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

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