Рекурсия - Lisp (229103)

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

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

Нужно прочитать из стандартного потока ввода список, содержащий целые числа, значения nil и другие списки. С помощью рекурсии, заменить в прочитанном списке и вложенных в него списках все списки, содержащие только нечетные числа, суммой этих чисел. Вывести в стандартный поток вывода полученный результат.

Решение задачи: «Рекурсия»

textual
Листинг программы
(defun task-fin (lst)
 (let ((tmp (task lst)))
   (if (and (listp tmp) (forall tmp 'numberp) (forall tmp 'oddp)) (apply '+ tmp) tmp)))
 
==> TASK-FIN
 
(task-fin '(1 (3 5) 4))
 
==> (1 8 4)
 
(task-fin '(3 5 7))
 
==> 15

Объяснение кода листинга программы

В коде определён функционал для выполнения задачи, названной TASK-FIN, с помощью рекурсии.

  1. defun определяет функцию с именем task-fin, которая принимает один аргумент lst.
  2. Функция использует let для создания временной переменной tmp, которая равна результату выполнения функции task с аргументом lst.
  3. С помощью условного оператора if проверяется, является ли значение tmp списком, содержащим только числа и нечётные числа.
  4. Если условие истинно, то с помощью функции apply и оператора + суммируются все элементы в списке tmp.
  5. Результатом работы функции является значение tmp. Пример использования функции:
  6. Вызов task-fin '(1 (3 5) 4) возвращает (1 8 4), потому что функция суммирует все числа в списке, которые являются нечётными.
  7. Вызов task-fin '(3 5 7) возвращает 15, потому что функция суммирует все числа в списке.

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

7   голосов , оценка 3.857 из 5