#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 будут приходить парами, один из которых должен быть меньше квадратного корня.