Разобраться в ошибке - Lisp (229492)

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

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

Задача:сформировать список,содержащий номера позиций элементов исходного списка,удовлетворяющих заданному условию (в моем случае элемент должен быть положительным)
Листинг программы
  1. (defun f(x)(if (> x 0) T nil));;предикат выводящий Т если число больше нуля,в противном случае Nil
  2. (defun pos (x L);;функция находящая позицию(индекс) элемента в списке
  3. (if (eq (car L) x) 0 (+ 1 (pos x (cdr L)))))
  4. (defun spisok_pozich(L f pos);;главная функция
  5. (
  6. cond ((null l) nil)
  7. (t
  8. ((f(car l) T) (cons (pos(carl L)) (spisok_pozich((cdr L) f pos))))
  9. )))

Решение задачи: «Разобраться в ошибке»

textual
Листинг программы
  1. (defun spisok_pozich(L f &optional (n 0))
  2.  (cond ((null l) nil)
  3.        ((funcall f (car l)) (cons n (spisok_pozich (cdr L) f (+ 1 n))))
  4.        (t (spisok_pozich (cdr L) f (+ 1 n)))))
  5.  
  6. ==> spisok_pozich
  7.  
  8. (spisok_pozich '(1 -2 9 -5 2) 'f)
  9.  
  10. ==> (0 2 4)

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

В данном коде определенная функция spisok_pozich принимает три аргумента: список L, функцию f и опциональный аргумент n со значением по умолчанию 0. Если список L пуст, то возвращается nil. Если функция f применительно к первому элементу списка L возвращает не nil, то возвращается новая функция, которая вызывается с аргументами (cdr L) (то есть, список без первого элемента), f и n + 1. Если первый элемент списка L не удовлетворяет условию выше, то вызывается рекурсивно spisok_pozich с аргументами (cdr L) (то есть, список без первого элемента), f и n + 1. Таким образом, если применить spisok_pozich к списку (1 -2 9 -5 2) и функции f, которая возвращает 2 при делении на 2 и 0 в противном случае, то вернется список (0 2 4). Это означает, что функция f вернула 2 при делении на 2 первого элемента списка (1 -2 9 -5 2), после чего была вызвана рекурсивно с аргументами (cdr L) (то есть, список без первого элемента) и n + 1 (то есть, 2 + 1 или 3). Поскольку второй элемент списка также удовлетворяет условию, то рекурсия продолжилась, и в итоге был возвращен список (0 2 4).

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


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

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

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

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

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

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