24.03.2015 Views

Harold Abelson and Gerald Jay Sussman with ... - ftp.linux.kiev.ua.

Harold Abelson and Gerald Jay Sussman with ... - ftp.linux.kiev.ua.

Harold Abelson and Gerald Jay Sussman with ... - ftp.linux.kiev.ua.

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1.1. Элементы программирования 41<br />

(define (test x y)<br />

(if (= x 0)<br />

0<br />

y))<br />

Затем он вычисляет выражение<br />

(test 0 (p))<br />

Какое поведение увидит Бен, если интерпретатор использует аппликативный порядок вычислений?<br />

Какое поведение он увидит, если интерпретатор использует нормальный порядок? Объясните<br />

Ваш ответ. (Предполагается, что правило вычисления особой формы if одинаково независимо<br />

от того, какой порядок вычислений используется. Сначала вычисляется выражениепредикат,<br />

и результат определяет, нужно ли вычислять выражение-следствие или альтернативу.)<br />

1.1.7. Пример: вычисление квадратного корня методом Ньютона<br />

Процедуры, как они описаны выше, очень похожи на обыкновенные математические<br />

функции. Они устанавливают значение, которое определяется одним или<br />

более параметром. Но есть важное различие между математическими функциями<br />

и компьютерными процедурами. Процедуры должны быть эффективными.<br />

В качестве примера рассмотрим задачу вычисления квадратного корня. Мы<br />

можем определить функцию «квадратный корень» так:<br />

√ x = такое y, что y ≥ 0 и y 2 = x<br />

Это описывает совершенно нормальную математическую функцию. С помощью<br />

такого определения мы можем решать, является ли одно число квадратным корнем<br />

другого, или выводить общие свойства квадратных корней. С другой стороны,<br />

это определение не описывает процедуры. В самом деле, оно почти ничего не говорит<br />

о том, как найти квадратный корень данного числа. Не поможет и попытка<br />

перевести это определение на псевдо-Лисп:<br />

(define (sqrt x)<br />

(the y (<strong>and</strong> (>= y 0)<br />

(= (sq<strong>ua</strong>re y) x))))<br />

Это только уход от вопроса.<br />

Противопоставление функций и процедур отражает общее различие между описанием<br />

свойств объектов и описанием того, как что-то делать, или, как иногда<br />

говорят, различие между декларативным знанием и императивным знанием. В

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!