Решение упражнения 1.32 из SICP
Вот теперь мы сведем сложение и умножение фактически к одному процессу. Разница в реализации будет минимальная, что подтверждает близость этих понятий.
Сначала запишем процедуру 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