Список из числовых элементов с учетом подсписков - Lisp

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

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

Доброго времени суток! Помогите, пожалуйста, найти ошибку в коде. Задача в следующем: Создать функцию, создающую список только из числовых элементов исходного списка, учитывая подсписки. Пример:
(fun  '( 2 3 4 (h 5) (5 ( h 5) 1))))
(2 3 4 5 5 5 1)
Я написала следующий код:
 (defun fun (lst)
   (cond
   ((null lst) nil)
   ( (numberp (car lst)) (cons (car lst) (fun (cdr lst))))
   ( (listp (car lst)) (cons (fun(car lst)) (fun (cdr lst))))
   (t (fun(cdr lst)))
))
Вызов дает вот такой результат:
(fun'( 2 3 4 (h 5) (5 ( h 5) 1)))
(2 3 4 (5) (5 (5) 1))
Как избавить от подсписков в результате?

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

textual
Листинг программы
(defun nums (w)
  (loop for a in w if (listp a) nconc (nums a)
        else if (numberp a) collect a))
 
> (nums '(a 1 (2 a) (((3 4 a)) 5 a)))
(1 2 3 4 5)

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

В этом коде определён функцией список из чисел с учётом подсписков.

  1. (defun — определение функции с именем nums)
  2. (loop — начало цикла)
  3. (for — цикл по элементам списка переменных)
  4. (if (listp a) — проверка является ли элемент списком)
  5. (nconc — объединение списков)
  6. (nums a) — рекурсивный вызов функции с аргументом a)
  7. (else if (numberp a) — проверка является ли элемент числом)
  8. (collect a) — сбор чисел в список)
  9. (return (1 2 3 4 5)) — возвращение результата
  10. (nums '(a 1 (2 a) (((3 4 a)) 5 a))) — вызов функции с аргументом (a 1 (2 a) (((3 4 a)) 5 a)))
  11. (1 2 3 4 5) — результат выполнения функции

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


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

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

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