Category: Решения упражнений

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

8 February, 2008 (22:10) | Решения упражнений | 1 comment

Как требуется в условии упражнения, будем менять только конструкторы и селекторы для суммы и произведения так, чтобы сделать возможной работу с произвольным числом слагаемых и множителей. Начнем с суммы.
Мы будем представлять сумму как список из символа + и последующего произвольного количества слагаемых. 
Селектор addend вообще не меняется:
(define (addend s) (cadr s))
Селектор augend будет возвращать либо одно последнее […]

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

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

Сначала модифицируем процедуру deriv с тем, чтобы она распознавала и операцию возведения в степень:
(define (deriv exp var)
  (cond ((number? exp) 0)
        ((variable? exp)
         (if (same-variable? exp var) 1 0))
        ((sum? exp)
         (make-sum (deriv (addend exp) var)
                   (deriv (augend exp) var)))
        ((product? exp)
         (make-sum
           (make-product (multiplier exp)
                         (deriv (multiplicand exp) var))
           (make-product (deriv (multiplier exp) var)
                         […]

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

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

В примечании 34 описывается особая форма quote и идентичность ее действия кавычке. Кроме того, указывается, что знак кавычки является просто сокращением для формы quote. Таким образом запись
(car ”abracadabra)
является лишь сокращенной формой записи для выражения
(car (quote (quote abracadabra)))
Первая quote заставляет интерпретатор понимать остаток записи буквально как список. Вполне очевидно, что для этого списка операция car возвращает символ […]

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

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

В соответствии с примечанием реализуем процедуру equal? таким образом, чтобы она корректно работала и с числами тоже. Отметим также, что мы считаем два пустых списка эквивалентными.
Процедуру equal? можно определить таким образом:
(define (equal? a b)
  (or (and (null? a)
           (null? b))
      (and (number? a)
           (number? b)
           (= a b))
      (and (symbol? a)
           (symbol? b)
           (eq? a […]

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

7 February, 2008 (20:54) | Решения упражнений | 1 comment

Это простое упражнение, проверяющее степень усвоения базового материала об использовании кавычки для представления символьных данных. Ответы приведены ниже:
> (list ‘a ‘b ‘c)
(a b c)
> (list (list ‘george))
((george))
> (cdr ‘((x1 x2) (y1 y2)))
((y1 y2))
> (cadr ‘((x1 x2) (y1 y2)))
(y1 y2)
> (pair? (car ‘(a short list)))
#f
> (memq ‘red ‘((red shoes) (blue socks)))
#f
> (memq ‘red ‘(red shoes blue […]

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

7 February, 2008 (20:23) | Решения упражнений | 2 comments

Описанные в каждом из пунктов упражнения изменения можно внести в результат, переопределив соответствующие процедуры указанным ниже образом:
(define wave-painter
  (segments->painter
    (append (polyline (make-vect 0 0.15)
                      (make-vect 0.15 0.4)
                      (make-vect 0.3 0.35)
                      (make-vect 0.4 0.35)
                      (make-vect 0.35 0.15)
                      (make-vect 0.4 0))
            (polyline (make-vect 0.6 0)
                      (make-vect 0.65 0.15)
                      (make-vect 0.6 0.35)
                      (make-vect 0.75 0.35)
                      (make-vect 1 0.65))
            […]

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

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

Определение below напрямую абсолютно аналогично определению beside. Отличия только в том, как происходит разбиение исходной рамки на две. В beside исходная рамка (0.0, 0.0) - (1.0, 1.0) разбивается на две по вертикали : (0.0, 0.0) - (0.5, 1.0) и (0.5, 0.0) - (1.0, 1.0).  В below та же исходная рамка разбивается несколько иначе (по горизонтали): (0.0, 0.0) […]

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

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

Для горизонтального отражения и поворотов на 180 и 270 градусов против часовой стрелки будем также применять transform-painter. Схематически каждое из этих преобразований обозначено на рисунке ниже:

Думаю, чертеж объясняет в даном случае лучше слов. Таким образом мы легко получаем следующие определения процедур:
(define (flip-horiz painter)
  (transform-painter painter
                     (make-vector 1.0 0.0)
                     (make-vector 0.0 0.0)
                     (make-vector 1.0 1.0)))
(define (rotate-180 […]

Решение упражнения 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))