Схема присвоения простого числа

#scheme

#схема

Вопрос:

У меня есть это назначение схемы, где мне нужно отобразить, являются ли целые числа в диапазоне 2-100 простыми или нет. Я знаю, что схема не позволяет изменять значение переменной, но, учитывая, как я это сделал, мне было интересно, можно ли это исправить.

 (let loop ((i 2))
  (begin (print "")
         (let loop ((j i))
           (begin ()
                  (if (and (= (mod i j) 0) (not (= i j)))
                      (print i " is NOT PRIME"))
                  (if (= j 2)
                      (print i " is PRIME")
                      (loop (- j 1)))))
         (if (= i 100)
             (print "done first")
             (loop (  i 1)))))
  

Комментарии:

1. Схема позволяет изменять переменную с set!

2. Помимо странного способа написания кода, я боюсь, что вы не сдадите экзамен, если будете использовать этот алгоритм для определения простых чисел. Самый прямой способ проверить простое число до 100 — это сохранить вектор и посмотреть, находятся ли входные данные в этом векторе. Простых чисел до 100 не так много

Ответ №1:

На данный момент вам нужно забыть о циклах подсчета / for, ищите рекурсивные шаблоны и полезные абстракции.

Например, этот фрагмент может быть полезным

 (define (test n)
 (if (prime? n)
     (begin (display i) (display " is prime.") (newline))
     (begin (display i) (display " is NOT prime.") (newline))))
  

Также (let loop ((var binding) ...) body) это не то, что вы думаете. Это не вариация цикла C for i=x... здесь это просто название, вы могли бы так же легко назвать это hiccup или roses. Форма используется там, где определение внутренней рекурсивной функции и вызов ее с помощью определенных выражений были бы такими же хорошими, но где подфункция не выиграла бы от описательной функции и свободных имен переменных.

Комментарии:

1. Спасибо. Я попробую это.

2. определение prime? зависит от вас, чтобы написать. И в качестве подсказки здесь вам нужно проверить делимость только на числа, меньшие или равные квадратному корню из n, поскольку целочисленные множители из n будут приходить парами, один из которых должен быть меньше квадратного корня.