40
Глава 1. Построение абстракций с помощ ью процедур
1.1.7. Пример: вычисление квадратного корня методом Ньютона
Процедуры, как они описаны выше, очень похожи на обыкновенные математические
функции. Они устанавливают значение, которое определяется одним или более парамет-
ром. Но есть важное различие между математическими функциями и компьютерными
процедурами. Процедуры должны быть эффективными.
В к ачестве примера рассмотрим задачу вычисления квадратного корня. Мы можем
определить функци ю «квадратный корень» так:
√
x = такое y, что y ≥ 0 и y
2
= x
Это описывает совершенно нормальную математическую функцию. С помощью такого
определения мы можем решать, является ли одно число квадратным корнем другого,
или выводить общие свойства квадратных корней. С другой стороны, это определение
не описывает процедуры. В самом деле, оно почти ничего не говорит о том, как найти
квадратный корень данного числа. Не поможет и попытка перевести э то определение на
псевдо-Лисп:
(define (sqrt x)
(the y (and (>= y 0)
(= (square y) x))))
Это только уход от вопроса.
Противопоставление функций и процедур отражает общее различие между описа-
нием свойств объектов и описанием того, как что-то делать, или, как иногда говорят,
различие между декларативным знанием и императивным знанием. В математике нас
обычно интересуют декларативные описания (что такое), а в информатике императив-
ные описания (как )
20
.
Как вычисляются квадратные корни? Наиболее часто при меняется Нью тонов метод
последовательных прибли жений, который основан на том, что имея некоторое неточное
значение y для квадратного корня из числа x, мы можем с помощью простой манипуля -
ции получить более точное значение (более близко е к настоящему квадратному корню),
если возьмем среднее между y и x/y
21
. Например, мы можем вычислить квадратный
20
Декларативные и императивные описания тесно связаны между собой, как и математика с информатикой.
Например, сказать, что ответ, получаемый программой, «верен», означает сделать об этой программе декла-
ративное утверждение. Существует большое количество исследований, направленных на отыскание методов
доказательства того, что программа корректна, и большая часть сложности этого предмета исследования свя-
зана с переходом от императивных утверждений (из которых строятся программы) к декларативным (которые
можно использовать для рассуждений). Связана с этим и такая важная область современных исследований
по проектированию языков программировани я, как исследование так называемыхязыков сверхвысокого уров-
ня, в которых программирование на самом деле происходит в терминах декларативных утверждений. Идея
состоит в том, чтобы сделать ин терпретаторы настолько умными, чтобы, получая от программиста знание типа
«что такое», они были бы способны самостоятельно породить знание типа «как». В общем случае это сделать
невозможно, но есть важные области, где удалось достичь прогресса. Мы вернемся к этой идее в главе 4.
21
На самом деле алгоритм нахождения квадратного корня представляет собой частный случай метода Нью-
тона, который является общим методом нахождения корней уравнений. Собственно алгоритм нахождения
квадратного корня был разработан Героном Александрийским в первом веке н.э. Мы увидим, как выразить
общий метод Ньютона в виде процедуры на Лиспе, в разделе 1.3.4.