88
Глава 1. Построение абстракций с помощ ью процедур
Упражнение 1.42.
Пусть f и g — две одноаргументные функции. По определению, композиция (composition) f и
g есть функция x 7→ f (g(x)). Определите процедуру compose которая реализует композицию.
Например, если inc — процедура, добавляющая к своему аргументу 1,
((compose square inc) 6)
49
Упражнение 1.43.
Если f есть численная функция, а n — положительное целое число, то мы можем построить
n-кратное применение f, которое определяется как функция, значение которой в точке x равно
f(f(. . . (f (x)) . . .)). Например, если f есть функция x 7→ x + 1, то n-кратным применением f
будет функция x 7→ x + n. Если f есть операция возведения в квадрат, то n-кратное применение
f есть функция, которая возводит свой аргумент в 2
n
-ю степень. Напишите процедуру, которая
принимает в качестве ввода процедуру, вычисляющую f, и положительное целое n, и возвращает
процедуру, вычисляющую n-кратное применение f . Требуется , чтобы Ваш у процедуру можно было
использовать в таких контекстах:
((repeated square 2) 5)
625
Подсказка: может оказаться удобно использовать compose из упражнения 1.42.
Упражнение 1.44.
Идея сглаживания (smoothing a function) играет важную роль в обработке сигналов. Если f —
функция, а dx — некоторое малое число, то сглаженная версия f есть функция, значение кото-
рой в точке x есть среднее между f(x − dx), f (x) и f(x + dx). Напишите процедуру smooth,
которая в качестве ввода принимает процедуру, вычисляющую f, и возвращает процедуру, вы-
числяющую сглаженную версию f. Иногда бывает удо бно проводить повторное сглаживание (то
есть сглаживать сглаженную функцию и т.д.), получая n-кратно сглаженную функцию (n-fold
smoothed function). Покажите, как породить n-кратно сглаженную функцию с помощью smooth и
repeated из упражнения 1.43.
Упражнение 1.45.
В разделе 1.3.3 мы видели, что попытка вычисления квадратных корней путем наивного поис -
ка неподвижной точки y 7→ x/y не сходится, и что это можно исправить путем торможения
усреднением. Тот же самый метод работает для нахождения кубического корня как неподвижной
точки y 7→ x/y
2
, заторможенной усреднением. К сожалению , этот процесс не работает для кор-
ней четвертой степени — однажды примененного торможения усреднением недостаточно, чтобы
заставить сходиться процесс поиска неподвижной точки y 7→ x/y
3
. С другой стороны, если мы
применим торможение усреднением дважды (т.е. применим торможение усреднением к результату
торможения усреднением от y 7→ x/y
3
), то поиск неподвижной точки начнет сходиться. Проде-
лайте эксперименты, чтобы понять, сколько торможений усреднением нужно, чтобы вычислить
корень n-ой степени как неподвижную точку на основе многократного торможения усреднением
функции y 7→ x/y
n−1
. Используя свои результаты для того, напишите простую процедуру вычис-
лениякорней n-ой степени с помощью процедур fixed-point, average-damp и repeated из
упражнения 1.43. Считайте, что все арифметические операции, какие Вам понадобятся, присут-
ствуют в языке как примитивы.