В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д