Как переделать код решенной задачи методом рекурсии на реализацию с циклами Do, и Loop - Lisp

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

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

Дана последовательность чисел а1 ... аn. Если в результате замены отрицательных членов последовательности их квадратами, члены будут образовывать последовательность которая уменьшается, то получить сумму членов исходной последовательности, в противном случае получить их произведение.
(DEFUN UBV(L &OPTIONAL (B NIL))
    (COND
    ((NULL L) (SETQ B NIL))
    ((NULL(CADR L)) B)
    ((>(CAR L)(CADR L)) (UBV(CDR L)(SETQ B T)))
    (T NIL)
    ))
    
(DEFUN SUM (L &OPTIONAL (S 0))
    (COND
    ((NULL L) S)
    ((NOT (NULL L)) (SUM (CDR L) (+ S (CAR L))))
))
 
(DEFUN MUL (L &OPTIONAL (M 1))
    (COND
    ((NULL L) M)
    ((NOT (NULL L)) (MUL (CDR L) (* M (CAR L))))
))
 
(DEFUN PR1(L &OPTIONAL (L2 NIL))
       (COND
         ((AND (NULL L)(NULL L2))  NIL)
         ((AND (NOT(NULL L))(MINUSP (CAR L))) (PR1 (CDR L) (APPEND L2 (LIST(* (CAR L)(CAR L))))))
         ((AND (NOT (NULL L))(PLUSP (CAR L))) (PR1 (CDR L) (APPEND L2 (LIST (CAR L)))))
         ((AND (NULL L) (NOT (NULL L2)) (UBV L2))  (SUM L2))
         ((AND (NULL L) (NOT (NULL L2)) (NOT (UBV L2))) (MUL L2))
           ))

Решение задачи: «Как переделать код решенной задачи методом рекурсии на реализацию с циклами Do, и Loop»

textual
Листинг программы
;; Функциональное
 
(defun task (lst)
  (let ((lst-n (mapcar (lambda (x) (if (minusp x) (* x x) x)) lst))) 
    (if (apply '> lst-n) (apply '+ lst) (apply '* lst))))
 
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 135
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144
 
;; итерационное с DO
 
(defun task (lst)
  (let ((n (length lst))
        (r nil))
   (do ((i 0 (+ i 1)))
        ((= i n) (if (apply '< r) (apply '+ lst) (apply '* lst)))
        (let ((c (nth i lst)))
          (push (if (minusp c) (* c c) c) r))))) 
 
==> TASK
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144
 
(task '(100 -8 50 -7))
 
==> 135
 
;; Итерационное с LOOP
 
(defun task (lst)
  (let ((n (length lst))
        (r nil)
        (i 0)
        (c 0))  
   (loop
      (when (= i n) (return (if (apply '< r) (apply '+ lst) (apply '* lst))))
      (setq c (nth i lst)) 
      (push (if (minusp c) (* c c) c) r)
      (setq i (+ i 1)))))
 
==> TASK
 
(task '(100 -8 50 -7))
 
==> 135
 
(task '(1 2 3 4 -1 -2 -3))
 
==> -144

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

Код выполняет следующие действия:

  1. Функция task принимает список lst в качестве входного параметра.
  2. В функциональном варианте кода, список lst преобразуется в список lst-n, где каждый элемент x заменяется на (* x x) если x отрицательный, иначе на x.
  3. Затем проверяется, больше ли lst-n чем текущий элемент списка lst. Если это так, то выполняется операция сложения для всех элементов списка lst, иначе выполняется операция умножения.
  4. В итерационном варианте кода с использованием DO, создается переменная r, которая инициализируется как пустой список.
  5. Затем выполняется цикл DO, который проходит через каждый элемент списка lst.
  6. Внутри цикла, элемент c сохраняется в переменной c.
  7. Если c отрицательный, то он заменяется на (* c c), иначе на c.
  8. Затем c добавляется в список r.
  9. После завершения цикла, проверяется, равен ли размер списка r размеру списка lst. Если это так, то выполняется операция сложения для всех элементов списка lst, иначе выполняется операция умножения.
  10. В итерационном варианте кода с использованием LOOP, создаются переменные n, r, i и c, которые инициализируются как пустой список и 0 соответственно.
  11. Затем выполняется цикл LOOP, который проходит через каждый элемент списка lst.
  12. Внутри цикла, проверяется, равен ли i размеру списка lst. Если это так, то цикл завершается и возвращается результат операции r.
  13. После проверки условия цикла, элемент c сохраняется в переменной c.
  14. Затем c добавляется в список r.
  15. После этого, i увеличивается на 1.
  16. Если цикл завершается, то выполняется операция сложения для всех элементов списка lst, иначе выполняется операция умножения.

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


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

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

15   голосов , оценка 4.2 из 5