Добавить символ звездочки после каждого неотрицательного элемента списка - Lisp

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

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

Не получается написать функцию, которая принимает на вход список, и преобразует его следующим образом: после каждого неотрицательного элемента добавляет звездочку. Например: исходный список: (0 b a -2 4) преобразованный список: ((0 *) b a -2 (4 *)) Помогите, пожалуйста!
Ошибку выдает компилятор: sh-4.4$ clisp main.lisp *** - >: NIL is not a real number
(defun f1 (list n)
           (if (>= (car list) 0)
           (append (cons (car list) n) (f1 (cdr list) n))
           (append(f1 (cdr list) n))
           )
)
 
(f1 '(2 -1 11) '*)

Решение задачи: «Добавить символ звездочки после каждого неотрицательного элемента списка»

textual
Листинг программы
(defun f (lst)
  (cond ((null lst) nil)
        ((numberp (car lst)) 
         (cons (if (>= (car lst) 0) (list (car lst) '*) (car lst)) (f (cdr lst))))
        (t (cons (car lst) (f (cdr lst))))))
          
==> F
 
(f  '(0 b a -2 4))
 
==> ((0 *) B A -2 (4 *))

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

В данном коде определён вспомогательный функтор F, который принимает на вход список lst и добавляет символ звездочки после каждого неотрицательного элемента списка. Код реализован с использованием композиции функций и рекурсии. В первой строке кода определена пустая функция с именем f, которая принимает на вход список lst и возвращает результат выполнения функции F. Второй строкой кода является условие, которое проверяет, является ли список пустым. Если это так, то возвращается значение nil. В третьей строке кода проверяется, является ли первый элемент списка числом. Если это так, то выполняется следующая часть условия: с помощью функции cons создаётся новый список, в который включается первый элемент списка (car lst), а затем символ звездочки. После этого вызывается рекурсивно функция F для обработки оставшейся части списка (cdr lst). В четвёртой строке кода проверяется, является ли первый элемент списка числом. Если это не так, то первый элемент списка включается в новый список без изменений, а затем вызывается рекурсивно функция F для обработки оставшейся части списка (cdr lst). В результате выполнения кода получается список, в котором после каждого неотрицательного элемента добавлен символ звездочки.

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

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