В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности - Lisp
Формулировка задачи:
В списке чисел найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности
пример работы
входные параметры: (1 2 (3 4 (5 6)) 7 8)
как должен происходить счёт: 2 + (6) + 7
Решение задачи: «В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности»
textual
Листинг программы
(defun task (lst &optional (c 1) (lv 1) (s 0)) (cond ((null lst) s) ((oddp lv) (cond ((and (evenp c) (numberp (car lst))) (task (cdr lst) (+ c 1) lv (+ s (car lst)))) ((listp (car lst)) (task (cdr lst) (+ c 1) lv (+ s (task (car lst) 1 (+ 1 lv) 0)))) (t (task (cdr lst) (+ c 1) lv s)))) (t (if (listp (car lst)) (task (cdr lst) c lv (+ s (task (car lst) 1 (+ lv 1) 0))) (task (cdr lst) c lv s)))))
Объяснение кода листинга программы
В коде определена функция task, которая принимает два аргумента: lst и c. Аргумент c — это счётчик, который увеличивает на единицу каждую вторую итерацию. Аргумент lst — это список, в котором нужно выполнить задачу.
Если lst — это nil, то возвращается s. Переменная s инициализируется как 0.
Если lv — это нечётное число (то есть oddp), то выполняется следующая операция:
- Если
c— это чётное число (то естьevenp) и элемент спискаcar lstявляется числом, то выполняется следующая операция: a. Увеличивается счётчикcна единицу. b. Выполняется рекурсивный вызов функцииtaskс аргументамиcdr lst,c + 1,lv + 1иs + (car lst). - Если
car lstявляется списком, то выполняется следующая операция: a. Увеличивается счётчикcна единицу. b. Выполняется рекурсивный вызов функцииtaskс аргументамиcdr lst,c + 1,lv + 1иs + (task (car lst) 1 (+ lv 1) 0). - Если
car lstне является списком или числом, то выполняется следующая операция: a. Увеличивается счётчикcна единицу. b. Выполняется рекурсивный вызов функцииtaskс аргументамиcdr lst,c + 1,lv + 1иs. Еслиlv— это чётное число (то естьevenp), то выполняется следующая операция: - Если
listp (car lst)— это истина, то выполняется следующая операция: a. Увеличивается счётчикcна единицу. b. Выполняется рекурсивный вызов функцииtaskс аргументамиcdr lst,c + 1,lv + 1иs + (task (car lst) 1 (+ lv 1) 0). - Если
listp (car lst)— это ложь, то выполняется следующая операция: a. Увеличивается счётчикcна единицу. b. Выполняется рекурсивный вызов функцииtaskс аргументамиcdr lst,c + 1,lv + 1иs.