Month: February, 2008

Решение упражнения 2.49 из SICP

5 February, 2008 (21:25) | Решения упражнений | 2 comments

Сначала простое. Рисовалка, обводящая рамку просто строит 4 отрезка, которые являются сторонами рамки, то есть соединяют точки (0, 0), (1, 0), (1, 1) и (0, 1):
(define outline-painter
  (segments->painter (list (make-segment (make-vect 0 0)
                                         (make-vect 1 0))
                           (make-segment (make-vect 1 0)
                                         (make-vect 1 1))
                           (make-segment (make-vect 1 1)
                                         (make-vect 0 1))
                           (make-segment (make-vect 0 1)
                                         (make-vect […]

Решение упражнения 2.48 из SICP

4 February, 2008 (21:57) | Решения упражнений | No comments

Снова будем для представления направленного отрезка пару. На этот раз элементами пары будут вектора к началу и концу отрезка из начала координат.
Конструктор и селекторы будут такими:
(define (make-segment start end)
(cons start end))

(define (start-segment segment)
(car segment))

(define (end-segment segment)
(cdr segment))

Решение упражнения 2.47 из SICP

4 February, 2008 (21:36) | Решения упражнений | No comments

Итак, селекторы для первого варианта представления рамки записываются следующим образом:
(define (origin-frame frame)
(car frame))

(define (edge1-frame frame)
(cadr frame))

(define (edge2-frame frame)
(caddr frame))
Селекторы для второго варианта выглядят так:
(define (origin-frame frame)
(car frame))

(define (edge1-frame frame)
(cadr frame))

(define (edge2-frame frame)
(cddr frame))
Как видим, отличие лишь в последнем селекторе, что легко пояснить тем, […]

Решение упражнения 2.46 из SICP

4 February, 2008 (21:15) | Решения упражнений | 1 comment

Это упражнение не вызовет труда у тех, кто разобрался с концепциями барьеров абстракции, конструкторов и селекторов.
Для представления векторов я выбрал пары. Можно было бы избрать и альтернативную форму, например списки, что было бы более удобно при работе с многомерными векторами. Но в случае двумерного пространства пара видится простейшим способом представления.
Конструктор и селекторы для векторов выглядят […]

Решение упражнения 2.45 из SICP

4 February, 2008 (20:56) | Решения упражнений | No comments

У процедур right-split и up-split есть очень много общего. По сути, они отличаются лишь порядком вызова операций beside и below. Таким образом мы можем ввести обобщенную операцию generic-split, которая будет задавать схему работы, общую для right-split и up-split, и процедуру высшего порядка split, которая с помощью generic-split по заданным операциям (главной и вложенной) будет генерировать конкретную […]

Решение упражнения 2.44 из SICP

4 February, 2008 (20:19) | Решения упражнений | No comments

Процедура up-split очень похожа на приводящуюся в книге right-split. Если right-split оставляет в левой части рамки старую рисовалку (ох и перевод!), а правую делит на две расположенные одна под другой части и вызывает себя для них рекурсивно, то up-split оставляет старую рисовалку в нижней половине рамки, а верхнюю делит на две части, расположенные рядом по […]

Решение упражнения 2.43 из SICP

3 February, 2008 (14:21) | Решения упражнений | 1 comment

Переставив фрагменты программы, Хьюго внес рекурсивный вызов queen-cols внутрь итерации по номерам строк, то есть если ранее при решении задачи для доски NxN решение задачи для доски (N-1)x(N-1) вычислялось один раз, то теперь это происходит N раз. Таким образом здесь пахнет экспоненциальным ухудшением производительности.
Примем упрощенно, что обработка очередной позиции (добавление одного ферзя и проверка на […]

Решение упражнения 2.42 из SICP

3 February, 2008 (12:47) | Решения упражнений | 8 comments

Задача о восьми ферзях - это классический пример проблемы, которая решается перебором вариантов. Задача сама по себе, как и задача о Ханойских башнях, весьма интересна, а ее решение показывает несколько важных алгоритмических приемов.
Каркас процедуры решения за нас уже определили заботливые авторы, нам же осталось только задать представление позиций на доске константой empty-board и процедурой adjoin-position, […]

Ханойские башни на Scheme

1 February, 2008 (21:02) | Задачи | 2 comments

Отвлечемся немного от решения упражнений (пятница, все же) и решим красивую задачку, которой в упражнениях к SICP нет (по крайней мере, пока не встретилось).
Задача о Ханойских башнях является классической алгоритмической задачей. Формулируется она следующим образом.
На одном из трех алмазных шпилей надето 64 круглых золотых диска. Диски имеют разные радиусы и расположены на шпиле в порядке […]

Отец русского перевода SICP

1 February, 2008 (07:19) | О книге | No comments

Сегодня выяснил, что создателем русского перевода SICP, который носит название “Структура и интерпретация компьютерных программ”, является Юрий Бронников, известный в интернете под ником gogabr.
Хочу выразить ему огромную признательность за очень хороший перевод. Это особенно ценно для такой фундаментальной книги, как творение Абельсона и Сассмана.