Сколько положительных чисел в числовом списке - Lisp

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

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

Определить функцию, вычисляющую, сколько положительных чисел в числовом списке двумя вариантами: 1. С помощью цикла 2. С помощью рекурсии Под списком понимается список с подсписками

Решение задачи: «Сколько положительных чисел в числовом списке»

textual
Листинг программы
  1. ;; Рекурсия
  2.  
  3. (defun task (lst)
  4.   (cond ((null lst) 0)
  5.         ((numberp (car lst)) (+ (if (plusp (car lst)) 1 0) (task (cdr lst))))
  6.         ((listp (car lst)) (+ (task (car lst)) (task (cdr lst))))
  7.         (t (task (cdr lst)))))
  8.  
  9. ==> TASK
  10.  
  11. (task '(1 2 (-7 8) (((9))) -5))
  12.  
  13. ==> 4
  14.  
  15. ;; Цикл
  16.  
  17. (defun task (lst)
  18.   (let ((tmp (list lst)) (s 0) (x nil))
  19.       (loop
  20.         (when (null tmp) (return s))
  21.         (setq x (pop tmp))
  22.         (dolist (a x nil)
  23.           (cond ((numberp a) (setq s (+ s (if (plusp a) 1 0))))
  24.                 ((listp a) (push a tmp)))))))  
  25.  
  26. ==> TASK
  27.  
  28. (task '(1 2 (-7 8) (((9))) -5))
  29.  
  30. ==> 4

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

В обоих кусках кода определена функция TASK, которая принимает в качестве аргумента список чисел. Функция использует в своей реализации рекурсию и цикл.

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы