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

Объяснение кода листинга программы

В данном коде написан алгоритм поиска простых чисел в заданном диапазоне. Он использует идею перебора чисел и проверки их на простоту с помощью решета Эратосфена.

  1. prime-closure - это функция-закрытая, которая генерирует список простых чисел от 2 до 201. Она использует let для создания локальной области видимости, в которой определяются две переменные: primes - список простых чисел, и current-prime - текущее число, которое проверяется на простоту. Внутри lambda происходит проверка, и если число простое, оно добавляется в список primes. После этого, current-prime увеличивается на 2, чтобы перейти к следующему числу.
  2. foo - это вспомогательная функция, которая принимает число n и флаг reset. Если reset установлен в #t, то список простых чисел сбрасывается до начального состояния (только число 2). Затем функция вызывает prime-closure для получения списка простых чисел и проверяет, больше ли первый элемент списка n. Если да, то возвращается остаток списка, иначе вызывается рекурсивно foo с n и reset установленным в #t, чтобы продолжить поиск простых чисел.
  3. main - это функция-точка входа, которая использует case-lambda для определения, что делать в зависимости от количества аргументов. Если нет аргументов, то вызывается foo с n = 21 и reset = #t. Если есть один аргумент, то вызывается foo с этим аргументом и reset = #t. Если есть два аргумента, то вызывается foo с n = n и reset = #t.
  4. Вызывая main без аргументов, мы получаем список простых чисел от 2 до 201, который выводится в консоль.
  5. Вызывая main с аргументом 30, мы вызываем foo с n = 30 и reset = #t. Поскольку primes содержит только числа от 2 до 31 (включая 2 и 31), мы получаем список простых чисел от 2 до 31, который также выводится в консоль.

ИИ поможет Вам:


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

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы