Найти и напечатать в порядке убывания все простые числа из диапазона от 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, который также выводится в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д