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

30 January, 2008 (20:41) | Решения упражнений

В этом упражнении мы видим, что накопление является очень обобщенным процессом, которым можно описать совершенно разные на первый взгляд процедуры.

Чтобы оперделить map через accumulate, начнем накопление с пустого списка и будем на этапе аккумулирования соединять с помощью cons результат применения отображающей процедуры с остальными результатами:

(define (map p sequence)
    (accumulate (lambda (x y) (cons (p x) y)) nil sequence))

Для реализации append мы просто начнем со второго списка и на каждом шаге будем добавлять первый элемент остатка первого списка к результату накопления для остатка первого списка без этого элемента. Сложно выразить словами, выглядит это так:

(define (append seq1 seq2)
    (accumulate cons seq2 seq1))

Для подсчета числа элементов последовательности начнем с нуля и будем просто на каждом шаге прибавлять 1 к накопленному до этого шага результату:

(define (length sequence)
    (accumulate (lambda (x y) (+ 1 y)) 0 sequence))

Таким образом из accumulate можно построить многие другие процедуры.

Write a comment