Ниже приведена функция sum, которая позволяет получить сумму элементов списка, не равных NIL - Lisp

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

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

Ниже приведена функция sum, которая позволяет получить сумму элементов списка, не равных NIL. К сожалению, эта функция работает не совсем правильно: допустим, что входной список содержит только элементы NIL и цифры. Найдите и исправьте ошибки.
Листинг программы
  1. (defun sum (lst)
  2. (let ((x (first lst)))
  3. (if (null x)
  4. (sum (rest x))
  5. (+ x (sum (rest x))))))

Решение задачи: «Ниже приведена функция sum, которая позволяет получить сумму элементов списка, не равных NIL»

textual
Листинг программы
  1. (defun sum (w &aux (a (car w)))
  2.   (if w (+ (if a a 0) (sum (cdr w))) 0))
  3.  
  4. > (sum '(5 nil 5 nil))
  5. 10

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

В коде определена функция с именем sum. Она принимает один аргумент w. В функции используется переменная a, которая инициализируется значением первого элемента списка, переданного в функцию. Если список пустой, то a инициализируется значением NIL. Далее в функции используется условная конструкция if. Если w не равно NIL, то выполняется выражение внутри if, которое состоит из двух частей, разделенных запятой. Первая часть выражения — это сумма чисел, которые не равны NIL. Для этого используется функция if с аргументом a. Если a не равно NIL, то возвращается само значение a, иначе возвращается 0. Вторая часть выражения — это рекурсивный вызов функции sum с аргументом (cdr w). Это позволяет получить сумму всех элементов списка, кроме первого. Если w равно NIL, то возвращается 0. Код был протестирован на примере '(5 nil 5 nil), где результатом выполнения функции sum является число 10.

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


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

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

15   голосов , оценка 3.733 из 5

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

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

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