Вы спрашиваете, почему «две, казалось бы, эквивалентные функции» дают разные результаты, но эти две функции в действительности сильно различаются.
Давайте попробуем упростить задачу, чтобы понять, почему они разные.Единственное различие между этими двумя функциями заключается в двух выражениях:
(repeat (average-damping (lambda (y) (/ x (expt y (- n 1)))))
num-repetitions)
((repeat average-damping num-repetition)
(lambda (y) (/ x (expt y (- n 1)))))
Чтобы упростить наше обсуждение, мы предполагаем num-repetition
равным 2 и более простую функцию, чем эта лямбда, например, следующая функция:
(define (succ x) (+ x 1))
Итак, теперь две разные части:
(repeat (average-damping succ) 2)
и
((repeat average-damping 2) succ)
Теперь для первого выражения (average-damping succ)
возвращает числовая функция, которая вычисляет среднее значение между параметром и его преемником:
(define h (average-damping succ))
(h 3) ; => (3 + succ(3))/2 = (3 + 4)/2 = 3.5
Итак, выражение (repeat (average-damping succ) 2)
эквивалентно:
(lambda (x) ((compose h h) x)
, что эквивалентноto:
(lambda (x) (h (h x))
Опять же, это числовая функция, и если мы применим эту функцию к 3, мы получим:
((lambda (x) (h (h x)) 3) ; => (h 3.5) => (3.5 + 4.5)/2 = 4
Во втором случае,вместо этого у нас есть (repeat average-damping 2)
, который производит совершенно другую функцию:
(lambda (x) ((compose average-damping average-damping) x)
, что эквивалентно:
(lambda (x) (average-damping (average-damping x)))
Вы видите, что на этот раз это высокоуровневая функция , а не целая, которая принимает функцию x
и применяет еедва раза average-damping
функция к нему.Давайте проверим это, применив эту функцию к succ
и затем применив результат к числу 3:
(define g ((lambda (x) (average-damping (average-damping x))) succ))
(g 3) ; => 3.25
Разница в результате не из-за числового приближения, а из-за другого вычисления: first (average-damping succ)
возвращает функцию h
, которая вычисляет среднее значение между параметром и его преемником;затем (average-damping h)
возвращает новую функцию, которая вычисляет среднее значение между параметром и результатом функции h
.Такая функция, если передано число, подобное 3, сначала вычисляет среднее значение от 3 до 4, что составляет 3,5, затем вычисляет среднее значение от 3 (снова параметр) до 3,5 (предыдущий результат), получая 3,25.