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