В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности - Lisp

Узнай цену своей работы

Формулировка задачи:

В списке чисел найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности пример работы входные параметры: (1 2 (3 4 (5 6)) 7 8) как должен происходить счёт: 2 + (6) + 7

Решение задачи: «В списке найти сумму чисел стоящих на чётных местах и только в подсписках в нечётных степенях вложенности»

textual
Листинг программы
  1. (defun task (lst &optional (c 1) (lv 1) (s 0))
  2.   (cond ((null lst) s)
  3.         ((oddp lv)
  4.            (cond ((and (evenp c) (numberp (car lst))) (task (cdr lst) (+ c 1) lv (+ s (car lst))))
  5.                  ((listp (car lst)) (task (cdr lst) (+ c 1) lv (+ s (task (car lst) 1 (+ 1 lv) 0))))
  6.                  (t (task (cdr lst) (+ c 1) lv s))))
  7.         (t (if (listp (car lst))
  8.                (task (cdr lst) c lv (+ s (task (car lst) 1 (+ lv 1) 0)))
  9.                (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы