Список из числовых элементов с учетом подсписков - 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)
Объяснение кода листинга программы
В этом коде определён функцией список из чисел с учётом подсписков.
- (defun — определение функции с именем nums)
- (loop — начало цикла)
- (for — цикл по элементам списка переменных)
- (if (listp a) — проверка является ли элемент списком)
- (nconc — объединение списков)
- (nums a) — рекурсивный вызов функции с аргументом a)
- (else if (numberp a) — проверка является ли элемент числом)
- (collect a) — сбор чисел в список)
- (return (1 2 3 4 5)) — возвращение результата
- (nums '(a 1 (2 a) (((3 4 a)) 5 a))) — вызов функции с аргументом (a 1 (2 a) (((3 4 a)) 5 a)))
- (1 2 3 4 5) — результат выполнения функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д