Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
399 / 378 / 408
Регистрация: 14.09.2013
Сообщений: 1,204
1

Макросы и функционалы

28.04.2016, 21:19. Показов 1620. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, можно ли переписать эти пару функций с помощью макросов и функционалов , если можно конечно, спасибо.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(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))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2016, 21:19
Ответы с готовыми решениями:

Макросы и функционалы
Задачу решить с использованием макросов и функционалов. Программа должна быть само модифицирующейся...

Макросы и функционалы
В число специализированных вариантов работы включить следующее: Выполнения некоторой процедуры по...

Функционалы и макросы
Помогите на Lisp с помощью функционалов и (или) макросов создать новую синтаксическую форму:...

Макросы и функционалы
Используя макросы и функции высших порядков (функционалы), составить программу, способную к...

2
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
29.04.2016, 17:27 2
Лучший ответ Сообщение было отмечено Svager как решение

Решение

Макросы здесь абсолютно не нужны (П.Грэм пишет в своей книге "ANSI Common Lisp": "Используйте макро только в тех случаях, когда требуемое невозможно реализовать с помощью функций").

Функционалы - другое дело. Циклы можно организовать с помощью mapcar и списков. Вот, к примеру, функция, которая проверяет, является ли ее параметр простым числом:

Lisp
1
2
3
(defun isPrime (n)
  (every (lambda (z) (not (zerop z)))
         (mapcar (lambda (p) (% n p)) (range 2 (flo2fix (sqr n))))))
Добавлено через 11 минут
А вот так можно построить список всех простых, не превышающих заданного n:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
;; Решето Эратосфена:
 
(defun sieve (lst)
  (cond ((null lst) nil)
        (t (cons (car lst) (sieve (remove-if (lambda (x) (zerop (% x (car lst)))) (cdr lst)))))))
 
==> sieve
 
;; Список простых
 
(defun primeList (n)
  (sieve (range 2 n)))
 
==> primeList
 
(primeList 50)
 
==> (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
Добавлено через 23 минуты
А вот и проверка гипотезы Гольдбаха:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun chk-Goldbach (n &optional (plist (primeList n)))
  (cond ((null plist) nil)
        (t (let ((lst (mapcar (lambda (x) (+ x (car plist))) plist)))
                (if (remove-if-not (lambda (x) (= n x)) lst)
                    (list (car plist) (- n (car plist)))
                    (chk-Goldbach n (cdr plist))))))) 
  
==> chk-Goldbach
 
(chk-Goldbach 30)
 
==> (7 23)
 
(chk-Goldbach 300)
 
==> (7 293)
4
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
13.05.2016, 15:28 3
Вот версия кода для Common Lisp (проверено в LispWorks):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defun range (n m)
  (cond ((> n m) nil)
        (t (cons n (range (+ n 1) m)))))
        
(defun isPrime (n)
  (every (lambda (z) (not (zerop z)))
         (mapcar (lambda (p) (rem n p)) (range 2 (sqrt n)))))
         
(defun sieve (lst)
  (cond ((null lst) nil)
        (t (cons (car lst) (sieve (remove-if (lambda (x) (zerop (rem x (car lst)))) (cdr lst)))))))
 
(defun primeList (n)
  (sieve (range 2 n)))
 
(defun chk-Goldbach (n &optional (plist (primeList n)))
  (cond ((null plist) nil)
        (t (let ((lst (mapcar (lambda (x) (+ x (car plist))) plist)))
                (if (remove-if-not (lambda (x) (= n x)) lst)
                    (list (car plist) (- n (car plist)))
                    (chk-Goldbach n (cdr plist)))))))
2
13.05.2016, 15:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2016, 15:28
Помогаю со студенческими работами здесь

Макросы и функционалы
Выполняя эту задачу надо составить, используя макросы и функции высших порядков (функционалы),...

Макросы и функционалы
Помогите решить задачу! Честно говоря, даже условия понять толком не могу((( В число...

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

Функционалы
Здравствуйте, помогите, пожалуйста решить следующую задачу. Как-то сложно у меня идет с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru