Найти и напечатать в порядке убывания все простые числа из диапазона от 2 до 201 - Lisp
Формулировка задачи:
найти и напечатать в порядке убывания все простые числа из диапазона от 2 до 201
Решение задачи: «Найти и напечатать в порядке убывания все простые числа из диапазона от 2 до 201»
textual
Листинг программы
- ;; racket-lang.org
- (define prime-closure
- (let ((primes '(2))
- (current-prime 3))
- (lambda (#:reset (reset #f))
- (when reset
- (set! primes '(2))
- (set! current-prime 3))
- (unless (ormap (lambda (x) (= (remainder current-prime x) 0)) primes)
- (set! primes (cons current-prime primes)))
- (set! current-prime (+ 2 current-prime))
- primes)))
- (define (foo n #:reset (reset #f))
- (let ((primes (prime-closure #:reset reset)))
- (if (> (first primes) n)
- (rest primes)
- (foo n))))
- (define main
- (case-lambda
- (() (foo 21 #:reset #t))
- ((n) (foo n #:reset #t))
- (n n)))
- (main)
- (main 30)
- ;'(19 17 13 11 7 5 3 2)
- ;'(29 23 19 17 13 11 7 5 3 2)
Объяснение кода листинга программы
В данном коде написан алгоритм поиска простых чисел в заданном диапазоне. Он использует идею перебора чисел и проверки их на простоту с помощью решета Эратосфена
.
prime-closure
- это функция-закрытая, которая генерирует список простых чисел от 2 до 201. Она используетlet
для создания локальной области видимости, в которой определяются две переменные:primes
- список простых чисел, иcurrent-prime
- текущее число, которое проверяется на простоту. Внутриlambda
происходит проверка, и если число простое, оно добавляется в списокprimes
. После этого,current-prime
увеличивается на 2, чтобы перейти к следующему числу.foo
- это вспомогательная функция, которая принимает числоn
и флагreset
. Еслиreset
установлен в#t
, то список простых чисел сбрасывается до начального состояния (только число 2). Затем функция вызываетprime-closure
для получения списка простых чисел и проверяет, больше ли первый элемент спискаn
. Если да, то возвращается остаток списка, иначе вызывается рекурсивноfoo
сn
иreset
установленным в#t
, чтобы продолжить поиск простых чисел.main
- это функция-точка входа, которая используетcase-lambda
для определения, что делать в зависимости от количества аргументов. Если нет аргументов, то вызываетсяfoo
сn = 21
иreset = #t
. Если есть один аргумент, то вызываетсяfoo
с этим аргументом иreset = #t
. Если есть два аргумента, то вызываетсяfoo
сn = n
иreset = #t
.- Вызывая
main
без аргументов, мы получаем список простых чисел от 2 до 201, который выводится в консоль. - Вызывая
main
с аргументом30
, мы вызываемfoo
сn = 30
иreset = #t
. Посколькуprimes
содержит только числа от 2 до 31 (включая 2 и 31), мы получаем список простых чисел от 2 до 31, который также выводится в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д