Подсчитать все пары элементов в списке - Lisp
Формулировка задачи:
Решение задачи: «Подсчитать все пары элементов в списке»
(defun cou (el lst) (cond ((null lst) 0) ((= el (car lst)) (+ 1 (cou el (cdr lst)))) (t (cou el (cdr lst))))) ==> cou (defun task (lst) (cond ((null (cdr lst)) 0) (t (+ (cou (car lst) (cdr lst)) (task (cdr lst)))))) ==> task (task '(1 1 1 2 2 3 3)) ==> 5
Объяснение кода листинга программы
В коде определены две функции: cou и task.
Функция cou принимает два аргумента: el и lst. Если lst равно nil, то возвращается 0. Если el равно car lst, то рекурсивно вызывается функция cou для el и cdr lst. В противном случае, рекурсивно вызывается функция cou для el и cdr lst.
Функция task принимает один аргумент: lst. Если cdr lst равно nil, то возвращается 0. Иначе, рекурсивно вызывается функция task для cdr lst.
В обоих функциях используется рекурсия для обработки каждого элемента списка.
Код был протестирован с помощью вызова функции task и передачи списка '(1 1 1 2 2 3 3)'. Функция должна была вернуть 5, что означает, что были обработаны все элементы списка и было найдено 5 пар одинаковых элементов.