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

Правда.

Comment from filimon
Date: September 11, 2012, 6:43 pm

Да уж.. всё больше убеждаюсь в том, что теперь я уже вряд ли когда-нибудь вернусь к Си.. пусть Лисп медленный.. зато, когда я пишу на Си, я сам медленный.. )))

Comment from Artem
Date: June 3, 2014, 3:18 pm

А я убеждаюсь, что программирование не мое, не могу я такое упражнение выполнить, как и многие предыдущие. :(

Write a comment