2014-02-11 2 views
0

Мне было предложено перевести пару функций C в схему для назначения. Мой профессор очень кратко остановился на том, как работает схема, и мне трудно понять. Я хочу создать функцию, которая проверяет, какой номер больше, чем другой, и продолжает проверять каждый раз, когда вы вводите новый номер. Проблема, с которой я столкнулась, - это объявление переменной. Я не понимаю, как вы присваиваете значение id.Использование локальных переменных в схеме

(define max 1) 

(define (x x) 
    (let maxfinder [(max max)] 
    (if (= x 0) 
     0 
     (if (> max x) 
      max 
      ((= max x) maxfinder(max)))))) 

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу инициализировать max как константу и изменить x. На мой взгляд, это настроено как бесконечные петли с выходом при x = 0. Если max is> x, с которым он не должен быть в первый раз, установите max = x и верните x. Я не знаю, что делать с константой max. Мне нужно, чтобы это была локальная переменная. Спасибо

ответ

0

Использование скобок очень строгое. Помимо специальных форм, они используются для вызова процедур. например, (> max x) вызывается процедура > с аргументами max и x. ((if (> x 3) - +) 6 x) - пример, где форма if возвращает процедуру и вызывается результат.

  • ((= max x) ...) оценивает (= max x) и так как результат не является процедурой, она не будет выполнена.
  • maxfinder без круглых скобок - всего лишь объект процедуры.
  • (max) не будет работать с max - это номер, а не процедура.

Что касается вас проблема. Вы добавляете дополнительные переменные, которые нужно изменить в названии let. Например. процедура, которая принимает число n и делает список с номером 0-n.

(define (make-numbered-list n) 
    (let loop ((n n) (acc '())) 
    (if (zero? n) 
     acc 
     (loop (- n 1) (cons n acc))))) 

Локальные переменные являются только локально связанными символами. Это может быть переписано

(define (make-numbered-list n) 
    (define (loop n acc) 
    (if (zero? n) 
     acc 
     (loop (- n 1) (cons n acc)))) 
    (loop n '())) 

В отличие от Algol диалектов как C вы не мутируют переменные в цикле, но используют recusion, чтобы изменить их.

Успехов

0

Если я вас правильно понимаю, вы ищете эквивалент статической переменной функции Си в. Это называется closure на Схеме.

Вот пример реализации функции вы кормите номера, чтобы, и который всегда будет возвращать текущий максимум:

(define maxfinder 
    (let ((max #f))     ; "static" variable, initialized to False 
    (lambda (n)      ; the function that is defined 
     (when (or (not max) (< max n)) ; if no max yet, or new value > max 
     (set! max n))    ; then set max to new value 
     max)))       ; in any case, return the current max 

затем

> (maxfinder 1) 
1 
> (maxfinder 10) 
10 
> (maxfinder 5) 
10 
> (maxfinder 2) 
10 
> (maxfinder 100) 
100 

Так что это будет работать, но не дает никакого механизма повторно использовать функцию в другом контексте.Ниже более обобщенный вариант создает новый функцию при каждом вызове:

(define (maxfinder) 
    (let ((max #f))     ; "static" variable, initialized to False 
    (lambda (n)      ; the function that is returned 
     (when (or (not max) (< max n)) ; if no max yet, or new value > max 
     (set! max n))    ; then set max to new value 
     max)))       ; in any case, return the current max 

использование, как это:

> (define max1 (maxfinder)) ; instantiate a new maxfinder 
> (max1 1) 
1 
> (max1 10) 
10 
> (max1 5) 
10 
> (max1 2) 
10 
> (max1 100) 
100 

> (define max2 (maxfinder)) ; instantiate a new maxfinder 
> (max2 5) 
5 
0

Определяет функцию для определения максимального между двумя числами:

(define (max x y) 
    (if (> x y) x y)) 

Определить функцию «конец»

(define end? zero?) 

не следует определить функцию для цикла до end? вычисления max

(define (maximizing x) 
    (let ((input (begin (display "number> ") (read)))) 
    (cond ((not (number? input)) (error "needed a number")) 
      ((end? input) x) 
      (else (maximizing (max x input)))))) 

удар ее:

> (maximizing 0) 
number> 4 
number> 1 
number> 7 
number> 2 
number> 0 
7 
Смежные вопросы