Существует несколько способов преобразования кода в вопросе в схему.Первое, о чем я могу подумать:
(define (print-even n)
(let loop ((i 0))
(if (<= i n)
(begin
(print i)
(newline)
(loop (+ i 2))))))
Обратите внимание:
- Решение записано как рекурсивная процедура
- Вместо цикла
for
Я использую конструкцию с именем с именем let , которая разрешает инициализацию некоторых итерационных переменных (i
в этом случае инициализируется 0
) и повторное выполнение рекурсивной процедуры (loop
в данном случае), производя эффект, аналогичный for
, даже по производительности - Условие остановки в «цикле» обрабатывается по существу с тем же выражением: повторять тело итерации до тех пор, покакак
(<= i n)
, когда это условие становится ложным, итерация заканчивается begin
окружает тело "цикла", так же, как фигурные скобки {}
в исходном коде - Процедура
print
выполняет ожидаемую операцию;Для удобства чтения я добавил новую строку после печати каждого числа - Часть приращения исходного цикла
i += 2
обрабатывается выражением (+ i 2)
внутри рекурсивного вызова
ТакВидите ли, выполняемый процесс по сути тот же, только способ записать это (синтаксис!) другой.Попробуйте, введите:
(print-even 6)
... И на экране будет напечатано следующее:
0
2
4
6
Другой возможный способ реализации процедуры, более похожий наисходный код, хотя (это совершенно субъективно) менее идиоматичен, чем предыдущий:
(define (print-even n)
(do ((i 0 (+ i 2))) ((> i n))
(print i)
(newline)))
Наконец, если вы используете Racket , это покажется вам еще более знакомым:
#lang racket
(define (print-even n)
(for ((i (in-range 0 (+ n 1) 2)))
(print i)
(newline)))