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

18 October, 2007 (21:24) | Решения упражнений

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

Сначала запишем процедуру accumulate в двух вариантах, порождающих соответственно рекурсивный и итеративный процессы.

Рекурсивный вариант:

(define (accumulate combiner null-value term a next b)
  (if (> a b)
      null-value
      (combiner (term a)
                (accumulate combiner null-value term (next a) next b))))

Итеративный вариант:

(define (accumulate combiner null-value term a next b)
  (define (iter a accumulator)
    (if (> a b)
        accumulator
        (iter (next a)
              (combiner accumulator (term a)))))
  (iter a null-value))

Сумма и произведение будут выражаться через накопление (аккумуляцию) следующим образом:

(define (sum term a next b)
  (accumulate + 0 term a next b))
(define (product term a next b)
  (accumulate * 1 term a next b))

Правда, красиво?

Comments

Comment from Johnny
Date: November 6, 2009, 9:39 pm

Правда.

Write a comment