Сколько положительных чисел в числовом списке - 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 для этого элемента и результат прибавляется к общему числу.
- Если текущий элемент не является числом или списком, то он помещается в конец списка для обработки следующей итерацией.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д