Функции Рекурсия - Lisp

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

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

Помогите, пожалуйста, с рекурсивной функцией, никак врубиться не могу. Написать функцию, аргументом которой является многоуровневый список, атомы которого могут быть как числа, так и символьные атомы. Функция должна менять все числа на атом NUM. Например: (a s 4 (s 1 2) c) ==> (a s num (s num num) c)

Решение задачи: «Функции Рекурсия»

textual
Листинг программы
 (defun task (lst n) 
    (cond ((null lst) nil) 
           ((listp (car lst)) (cons (task (car lst)) (task (cdr lst)))) 
           ((numberp (car lst)) (cond ((> (car lst) n) (cons 'num (task (cdr lst))))
    (t (cons (car lst) (task (cdr lst)))))) 
    (t (cons (car lst) (task (cdr lst)))))) 
 
 (task ' (a s 10 3 f) 4)

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

В коде определена функция task, которая принимает два аргумента: lst — список, который необходимо обработать, и n — номер текущего элемента списка. Функция проверяет, является ли список пустым. Если это так, то возвращается nil. Если первый элемент списка является списком, то он передается в функцию task, а результат привязывается к первому элементу нового списка. Затем функция вызывается рекурсивно для оставшейся части списка. Если первый элемент списка является числом, то проверяется, больше ли оно числа n. Если это так, то возвращается число с меткой 'num. В противном случае функция вызывается рекурсивно для оставшейся части списка. Если первый элемент списка не является списком или числом, то он просто добавляется в новый список. Затем функция вызывается рекурсивно для оставшейся части списка. В конце кода функция task вызывается с аргументами '(a s 10 3 f) и 4.

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


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

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

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