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