Макросы и функционалы - Lisp (229438)
Формулировка задачи:
Добрый вечер, можно ли переписать эти пару функций с помощью макросов и функционалов , если можно конечно, спасибо.
(defun proste(a) (if (< a 2) nil (if (= a 2) T (do ((i 2 (+ i 1))) ((= i a) T) (if (= 0 (mod a i)) (return nil)))))) (defun Goldbach (N) (if (or (< N 2) (not (= 0 (mod N 2)))) nil (do ((i 2 (+ i 1))) ((> i n) nil) (if (and (proste i) (proste (- N i))) (return (list i (- N i))))))) (defun goldbach_list_limited (lower upper limit) (do ((i (cond ((< lower 4) 4) ((= 0 (mod lower 2)) lower) (t (+ lower 1))) (+ i 2))) ((> i upper)) (progn (setq small-prime (first (goldbach i))) (setq big-prime (second (goldbach i))) (if (> small-prime limit) (format t "~a~a~a~a~a~%" i " = " small-prime " + " big-prime))))) (print (goldbach_list_limited 1 2000 50))
Решение задачи: «Макросы и функционалы»
textual
Листинг программы
(defun isPrime (n) (every (lambda (z) (not (zerop z))) (mapcar (lambda (p) (% n p)) (range 2 (flo2fix (sqr n))))))
Объяснение кода листинга программы
В данном коде определён функционал с именем isPrime, который проверяет является ли число n простым. Код функционала следующий:
- (defun isPrime (n) ...)
- (every (lambda (z) (not (zerop z))) ...)
- (mapcar (lambda (p) (% n p)) ...)
- (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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д