Month: January, 2008

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

27 January, 2008 (13:34) | Решения упражнений | No comments

Есть несколько способов записать подобную процедуру for-each. Я предлагаю следующий:

(define (for-each proc items)
(cond ((not (null? items))
(proc (car items)) (for-each proc (cdr items)))))
Он хорош своей краткостью. Конструкция cond используется для создания блочной структуры, так как нам нужно выполнить сразу два действия:

обработать первый элемент списка;
рекурсивно вызвать […]

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

27 January, 2008 (13:16) | Решения упражнений | 1 comment

Рассмотрим первую попытку Хьюго реализовать square-list:
(define (square-list items)
(define (iter things answer)
(if (null? things)
answer
(iter (cdr things)
(cons (square (car things))
[…]

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

26 January, 2008 (19:42) | Разное | No comments

Еще одно несложное, но важное для понимания основ упражнение. Закончить определения процедуры square-list можно таким образом:
(define (square-list items)
  (if (null? items)
      nil
      (cons (square (car items)) (square-list (cdr items)))))
(define (square-list items)
  (map square items))
Как видите, использование процедуры обобщенного отображения списков здорово упрощает жизнь.
Хочу сделать замечание по синтаксису Scheme в отношении значения nil. Я пользуюсь DrScheme, в котором значение […]

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

26 January, 2008 (19:29) | Решения упражнений | 7 comments

Довольно интересное упражнение с учетом того, что пока мы не рассматривали вопросы обобщенного отображения и фильтрации списков (очевидно, нас подводят к этим важным понятиям).
Итак, с помощью точечной записи мы выделим первое значение из переданных и список остальных значений. Далее просто пройдем по списку остальных значений и отфильтруем его, составив список чисел той же четности, что и первое […]

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

26 January, 2008 (19:04) | Решения упражнений | 5 comments

Определить процедуры no-more?, first-denmomination и except-first-denomination можно таким образом:
(define (no-more? coin-values)
  (null? coin-values))
(define (first-denomination coin-values)
  (car coin-values))
(define (except-first-denomination coin-values)
  (cdr coin-values))
Определения тривиальны, но это достигается продуманностью процедуры cc, которая берет сложность работы на себя.
Порядок списка coin-values на результат не влияет, так как алгоритм, реализуемый процедурой cc, работает независимо от того, как упорядочены номиналы монет. Проверим это:
> […]

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

24 January, 2008 (21:19) | Решения упражнений | 6 comments

Для того, чтобы развернуть список, нужно просто перекинуть подряд все элементы списка, начиная с первого, в новый список, причем добавлять каждый последующий элемент в начало строящегося списка.
Этот подход легко реализуется следующей процедурой:
(define (reverse items)
  (define (reverse-iter source result)
    (if (null? source)
        result
        (reverse-iter (cdr source) (cons (car source) result))))
  (reverse-iter items (list)))
Обратите внимание, что вызов […]

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

24 January, 2008 (20:59) | Решения упражнений | No comments

При нахождении последней пары мы просто будем двигаться по списку пар, начиная с головы списка, и проверять, не указывает ли хвостовой указатель головной пары (получаемый процедурой cdr) на nil. Как только мы обнаржим такую пару, мы ее вернем.
(define (last-pair list)
  (if (null? (cdr list))
      list
      (last-pair (cdr list))))
Написать код в данном случае даже проще, чем […]

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

24 January, 2008 (20:18) | Решения упражнений | 7 comments

Итак, почему же эквивалентные алгебраические выражения дают разные результаты в построенной нами совместно с Лизой интервальной арифметике?
Собственно говоря, а почему они должны давать одинаковые результаты? Ведь интервалы - это не действительные числа. Даже простейшие свойства операций над числами не выполняются для интервалов (например, А/А не даст единицу, так же как А-А не будет равно точно […]

Свежие видео SICP из Беркли

24 January, 2008 (07:51) | Видео, Материалы | 2 comments

Вчера в Университете Беркли (UC Berkeley) стартовал курс CS61A: Structure and Interpretation of Computer Programs. Курс продлится до мая этого года. Читать лекции будет Брайан Харви. Самое замечательное то, что вебкасты (видео, доступное онлайн) этих лекций оперативно выкладываются на сайте университета. Вчерашняя лекция (чуть больше 50 минут) уже там и доступна в форматах real media […]

Больше решений, хороших и разных

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

Между делом обнаружил еще несколько человек, публикующих свои решения упражнений из “Структуры и интерпретации компьютерных программ” и не могу пройти мимо, не отрекомендовав их. Дам 2 ссылки на англоязычные ресурсы:

SICP Solutions на SchemeWiki - содержит пока что только часть решений из второй главы; пояснений не очень много, больше кода.
Раздел SICP на The Loser Blog - пока содержит […]