Как преобразовать этот код в схему - PullRequest
0 голосов
/ 18 марта 2012

Таким образом, в основном цель этого кода - просто распечатать первые n четных чисел.

for (i = 0; i <=n; i+= 2)
{
    print i;
}

Дело в том, что я вообще не понимаю Scheme.Так что помогите пожалуйста.

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Способ Scheme сделать что-то подобное - использовать рекурсивную функцию, подобную приведенной ниже.

(define (doit value n)
  (if (<= value n)
    (begin
      ;;...perform loop body with x...
      (display value)(newline)
      (doit (+ value 2) n))))

Чтобы вызвать эту функцию, вы вызываете (doit 2 n), где n - это ваш n в цикле for.

Что касается изучения Схемы, я рекомендую первые две ссылки ниже.

Для получения дополнительной информации о Схеме см.

1 голос
/ 18 марта 2012

Существует несколько способов преобразования кода в вопросе в схему.Первое, о чем я могу подумать:

(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)))
1 голос
/ 18 марта 2012

Первое большое различие между Scheme и другими языками заключается в следующем: в Scheme вы делаете (почти) все рекурсивно.

Например, чтобы реализовать простой цикл, вы должны определить рекурсивную функцию. Эта функция сначала проверит, не пора ли выйти из цикла; Если есть, он вернет окончательное значение. (В этом случае нет окончательного значения, поэтому он просто возвращает что-то вроде (void) или '().) В противном случае функция будет делать то, что должна, затем снова вызовет себя.

Любые переменные цикла (например, i) становятся аргументами функции.

Надеюсь, это поможет вам понять, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...