Определить номер первого вхождения заданного элемента в список - Lisp
Формулировка задачи:
Необходимо написать функцию, которая определяет номер первого вхождения заданого элемента в список L
Решение задачи: «Определить номер первого вхождения заданного элемента в список»
textual
Листинг программы
(defun pos-in-list (lst elt &optional (p 0)) (if (null lst) nil (if (equal (car lst) elt) p (pos-in-list (cdr lst) elt (+ p 1))))) ==> pos-in-list (pos-in-list '(1 2 3 a b c) 'a) ==> 3 (pos-in-list '((1 2) (3 a) (b c)) '(b c)) ==> 2 (pos-in-list '((1 2) (3 a) (b c)) '(c d)) ==> NIL
Объяснение кода листинга программы
В коде определённая функция pos-in-list принимает три аргумента: lst (список), elt (элемент) и p (счётчик). Если список lst пуст, то возвращается nil. Если первый элемент списка lst равен elt, то возвращается значение счётчика p. В противном случае, рекурсивно вызывается функция pos-in-list для списка cdr lst и аргументов elt и p+1.
Пример использования функции:
(pos-in-list '(1 2 3 a b c) 'a)— в этом примере функция будет искать первое вхождение символа 'a' в списке '(1 2 3 a b c). Возвращаемое значение будет 3, так как 'a' находится на третьей позиции в списке.(pos-in-list '((1 2) (3 a) (b c)) '(b c))— в этом примере функция будет искать первое вхождение списка '(b c)' в списке '((1 2) (3 a) (b c)). Возвращаемое значение будет 2, так как '(b c)' находится на второй позиции в списке.(pos-in-list '((1 2) (3 a) (b c)) '(c d))— в этом примере функция будет искать первое вхождение списка '(c d)' в списке '((1 2) (3 a) (b c)). Возвращаемое значение будетnil, так как '(c d)' не найден в списке.