Month: January, 2008
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 используется для создания блочной структуры, так как нам нужно выполнить сразу два действия:
обработать первый элемент списка;
рекурсивно вызвать […]
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))
[…]
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, в котором значение […]
26 January, 2008 (19:29) | Решения упражнений | 7 comments
Довольно интересное упражнение с учетом того, что пока мы не рассматривали вопросы обобщенного отображения и фильтрации списков (очевидно, нас подводят к этим важным понятиям).
Итак, с помощью точечной записи мы выделим первое значение из переданных и список остальных значений. Далее просто пройдем по списку остальных значений и отфильтруем его, составив список чисел той же четности, что и первое […]
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, работает независимо от того, как упорядочены номиналы монет. Проверим это:
> […]
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)))
Обратите внимание, что вызов […]
24 January, 2008 (20:59) | Решения упражнений | No comments
При нахождении последней пары мы просто будем двигаться по списку пар, начиная с головы списка, и проверять, не указывает ли хвостовой указатель головной пары (получаемый процедурой cdr) на nil. Как только мы обнаржим такую пару, мы ее вернем.
(define (last-pair list)
(if (null? (cdr list))
list
(last-pair (cdr list))))
Написать код в данном случае даже проще, чем […]
24 January, 2008 (20:18) | Решения упражнений | 7 comments
Итак, почему же эквивалентные алгебраические выражения дают разные результаты в построенной нами совместно с Лизой интервальной арифметике?
Собственно говоря, а почему они должны давать одинаковые результаты? Ведь интервалы - это не действительные числа. Даже простейшие свойства операций над числами не выполняются для интервалов (например, А/А не даст единицу, так же как А-А не будет равно точно […]
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 - пока содержит […]