Показать, что сумма и произведение являются примерами накопления


Учитывая эту задачу:

Упражнение 1.32

а. Показать, что сумма и продукт (упражнение 1.31) оба частными случаями еще более общего понятие накопления, который объединяет коллекция терминов, используя некоторые общая функция накопления:

(накапливать комбайнер нулевое значение термина следующий б)

Накопить принимает в качестве аргументов же срок и технические характеристики диапазон как сумма и товара, вместе с комбайнером процедуры (от двух аргументов), что указывает, как нынешний срок является быть в сочетании с накоплением предшествующие условия и нулевое значение что указывает, что базовой стоимости в использовании когда сроки закончатся. Писать накопить и показать, как сумма и продукт может быть определен как простой вызовы накапливаются.

б. Если процедура накапливать порождает рекурсивный процесс, пишите одна, что порождает итерационный процесс. Если она порождает итеративный процесс, напишу один, что создает рекурсивный процесс.

Я написал следующее решение:

Рекурсивно:

(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 (i-accumulate combiner null-value term a next b)
  (define (iter a result)
    (if (> a b) result
        (iter (next a) (combiner (term a) result))))
  (iter a null-value))

Сумма/продукт используя итерационный накапливаются:

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

Что вы думаете?



942
0
задан 30 марта 2011 в 04:03 Источник Поделиться
Комментарии
1 ответ

Поскольку единственный параметр, который меняется в вашей рекурсивное определение есть, вы можете написать внутреннее определение как так:

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

1
ответ дан 31 марта 2011 в 02:03 Источник Поделиться