Сколько положительных чисел в числовом списке - Lisp
Формулировка задачи:
Определить функцию, вычисляющую, сколько положительных чисел в числовом списке двумя вариантами:
1. С помощью цикла
2. С помощью рекурсии
Под списком понимается список с подсписками
Решение задачи: «Сколько положительных чисел в числовом списке»
textual
Листинг программы
;; Рекурсия (defun task (lst) (cond ((null lst) 0) ((numberp (car lst)) (+ (if (plusp (car lst)) 1 0) (task (cdr lst)))) ((listp (car lst)) (+ (task (car lst)) (task (cdr lst)))) (t (task (cdr lst))))) ==> TASK (task '(1 2 (-7 8) (((9))) -5)) ==> 4 ;; Цикл (defun task (lst) (let ((tmp (list lst)) (s 0) (x nil)) (loop (when (null tmp) (return s)) (setq x (pop tmp)) (dolist (a x nil) (cond ((numberp a) (setq s (+ s (if (plusp a) 1 0)))) ((listp a) (push a tmp))))))) ==> TASK (task '(1 2 (-7 8) (((9))) -5)) ==> 4
Объяснение кода листинга программы
В обоих кусках кода определена функция TASK, которая принимает в качестве аргумента список чисел. Функция использует в своей реализации рекурсию и цикл.
- Рекурсивный вариант:
- Если список пустой, то возвращается 0.
- Если первый элемент списка является числом и больше 0, то к результату прибавляется 1.
- Если первый элемент является списком, то рекурсивно вызывается функция TASK для этого элемента и результат прибавляется к общему числу.
- Если первый элемент не является числом или списком, то рекурсивно вызывается функция TASK для следующего элемента списка.
- Циклический вариант:
- Создается копия списка и переменной для подсчета количества чисел.
- Пока список не станет пустым, происходит следующее:
- Если текущий элемент является числом и больше 0, то к результату прибавляется 1.
- Если текущий элемент является списком, то рекурсивно вызывается функция TASK для этого элемента и результат прибавляется к общему числу.
- Если текущий элемент не является числом или списком, то он помещается в конец списка для обработки следующей итерацией.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д