Макросы и функционалы - Lisp (229438)

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

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

Добрый вечер, можно ли переписать эти пару функций с помощью макросов и функционалов , если можно конечно, спасибо.
Листинг программы
  1. (defun proste(a)
  2. (if (< a 2) nil
  3. (if (= a 2) T
  4. (do ((i 2 (+ i 1)))
  5. ((= i a) T)
  6. (if (= 0 (mod a i)) (return nil))))))
  7. (defun Goldbach (N)
  8. (if (or (< N 2) (not (= 0 (mod N 2)))) nil
  9. (do ((i 2 (+ i 1)))
  10. ((> i n) nil)
  11. (if (and (proste i) (proste (- N i)))
  12. (return (list i (- N i)))))))
  13. (defun goldbach_list_limited (lower upper limit)
  14. (do ((i (cond ((< lower 4) 4)
  15. ((= 0 (mod lower 2)) lower)
  16. (t (+ lower 1))) (+ i 2)))
  17. ((> i upper))
  18. (progn (setq small-prime (first (goldbach i)))
  19. (setq big-prime (second (goldbach i)))
  20. (if (> small-prime limit)
  21. (format t "~a~a~a~a~a~%" i " = " small-prime " + " big-prime)))))
  22. (print (goldbach_list_limited 1 2000 50))

Решение задачи: «Макросы и функционалы»

textual
Листинг программы
  1. (defun isPrime (n)
  2.   (every (lambda (z) (not (zerop z)))
  3.          (mapcar (lambda (p) (% n p)) (range 2 (flo2fix (sqr n))))))

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

В данном коде определён функционал с именем isPrime, который проверяет является ли число n простым. Код функционала следующий:

  1. (defun isPrime (n) ...)
  2. (every (lambda (z) (not (zerop z))) ...)
  3. (mapcar (lambda (p) (% n p)) ...)
  4. (range 2 (flo2fix (sqr n))) В первом пункте 2-го шага (every (lambda (z) (not (zerop z))) ...) осуществляется проверка каждого числа z из последовательности, что оно не равно нулю. Во втором пункте 2-го шага (mapcar (lambda (p) (% n p)) ...) происходит отображение каждого числа p из последовательности на результат вычисления (% n p), где n — это число, которое проверяется на простоту, а p — это числа из последовательности, которые берутся для проверки простоты числа n. В третьем пункте 2-го шага (range 2 (flo2fix (sqr n))) создаётся последовательность чисел от 2 до (flo2fix (sqr n)), где n — это число, которое проверяется на простоту. А на 1-м шаге происходит вызов функционала isPrime с аргументом n.

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


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

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

10   голосов , оценка 4.1 из 5

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

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

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