В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности - 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), то выполняется следующая операция:

  1. Если c — это чётное число (то есть evenp) и элемент списка car lst является числом, то выполняется следующая операция: a. Увеличивается счётчик c на единицу. b. Выполняется рекурсивный вызов функции task с аргументами cdr lst, c + 1, lv + 1 и s + (car lst).
  2. Если car lst является списком, то выполняется следующая операция: a. Увеличивается счётчик c на единицу. b. Выполняется рекурсивный вызов функции task с аргументами cdr lst, c + 1, lv + 1 и s + (task (car lst) 1 (+ lv 1) 0).
  3. Если car lst не является списком или числом, то выполняется следующая операция: a. Увеличивается счётчик c на единицу. b. Выполняется рекурсивный вызов функции task с аргументами cdr lst, c + 1, lv + 1 и s. Если lv — это чётное число (то есть evenp), то выполняется следующая операция:
  4. Если listp (car lst) — это истина, то выполняется следующая операция: a. Увеличивается счётчик c на единицу. b. Выполняется рекурсивный вызов функции task с аргументами cdr lst, c + 1, lv + 1 и s + (task (car lst) 1 (+ lv 1) 0).
  5. Если listp (car lst) — это ложь, то выполняется следующая операция: a. Увеличивается счётчик c на единицу. b. Выполняется рекурсивный вызов функции task с аргументами cdr lst, c + 1, lv + 1 и s.

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


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

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

12   голосов , оценка 4.167 из 5
Похожие ответы