LISP SICP Видео Лекция 2a Средний вопрос о сырости - PullRequest
2 голосов
/ 11 июля 2011

В следующем коде я пытаюсь понять, как переменная whatami получает свое значение.Следуя логике, я вижу, что процедура (lambda (y) (/ x y)) является параметром, который я передаю методу average-damp, и представлен в этом методе как переменная f.Кажется, что (/ x y) и (average (f whatami) whatami) должны быть выполнены, но я не могу понять порядок выполнения.Любая помощь приветствуется.

(define (average x y)
  (/ (+ x y) 2))

(define (fixed-point f start)
  (define tolerance 0.00001)
  (define (close-enuf? u v)
    (< (abs (- u v)) tolerance))
  (define (iter old new)
    (if (close-enuf? old new)
        new
        (iter new (f new))))
  (iter start (f start)))

(define average-damp
  (lambda (f)
    (lambda (whatami) (average (f whatami) whatami))))

; square root with average damping
(define (_sqrt x)
  (fixed-point
   (average-damp (lambda (y) (/ x y)))
   1))

(_sqrt 4.0)

1 Ответ

5 голосов
/ 11 июля 2011

Процедура average-damp принимает процедуру в качестве аргумента и возвращает процедуру в качестве значения.Если задана процедура, которая принимает один аргумент, average-damp возвращает другую процедуру, которая вычисляет среднее значение до и после применения исходной функции f к ее аргументу.Он находится внутри процедуры fixed-point, где эта возвращенная функция применяется (итеративно).

Таким образом, процедура average-damp вообще не выполняет ни (/ x y), ни (average(f whatami) whatami), она просто использует переданную функциючтобы создать новую функцию, которую он возвращает.

...