Сколько положительных чисел в числовом списке - 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, которая принимает в качестве аргумента список чисел. Функция использует в своей реализации рекурсию и цикл.

  1. Рекурсивный вариант:
    • Если список пустой, то возвращается 0.
    • Если первый элемент списка является числом и больше 0, то к результату прибавляется 1.
    • Если первый элемент является списком, то рекурсивно вызывается функция TASK для этого элемента и результат прибавляется к общему числу.
    • Если первый элемент не является числом или списком, то рекурсивно вызывается функция TASK для следующего элемента списка.
  2. Циклический вариант:
    • Создается копия списка и переменной для подсчета количества чисел.
    • Пока список не станет пустым, происходит следующее:
      • Если текущий элемент является числом и больше 0, то к результату прибавляется 1.
      • Если текущий элемент является списком, то рекурсивно вызывается функция TASK для этого элемента и результат прибавляется к общему числу.
      • Если текущий элемент не является числом или списком, то он помещается в конец списка для обработки следующей итерацией.

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

9   голосов , оценка 4 из 5
Похожие ответы