Показаны сообщения с ярлыком exercise sicp. Показать все сообщения
Показаны сообщения с ярлыком exercise sicp. Показать все сообщения

пятница, 7 января 2011 г.

Exercise-3-02


Упражнение 3.2.
При тестировании программ удобно иметь возможность подсчитывать, сколько раз за время вычислений была вызвана та или иная процедура. Напишите процедуру make-monitored, принимающую в качестве параметра процедуру f, которая сама по себе принимает один входной параметр. Результат, возвращаемый make-monitored — третья процедура, назовем ее mf, которая подсчитывает, сколько раз она была вызвана, при помощи внутреннего счетчика. Если на входе mf получает специальный символ how-many-calls?, она возвращает значение счетчика. Если же на вход подается специальный символ reset-count, mf обнуляет счетчик. Для любого другого параметра mf возвращает результат вызова f с этим параметром и увеличивает счетчик. Например, можно было бы сделать отслеживаемую версию процедуры sqrt:

(define s (make-monitored sqrt))
(s 100)
10
(s ’how-many-calls?)
1

Вполне прямолинейное решение

(define (make-monitored f)
  (let ((counter 0))
    (λ (arg) 
      (cond ((eq? arg 'how-many-calls?) counter)
            ((eq? arg 'reset-count?) (begin (set! counter 0) counter))
            (else (begin (set! counter (+ counter 1)) (f arg)))))))

Exercise-3-01

Упражнение 3.1.
Накопитель (accumulator) — это процедура, которая вызывается с одним численным аргументом и собирает свои аргументы в сумму. При каждом вызове накопитель возвращает сумму, которую успел накопить. Напишите процедуру make-accumulator, порождающую накопители, каждый из которых поддерживает свою отдельную сумму. Входной параметр make-accumulator должен
указывать начальное значение суммы; например,

(define A (make-accumulator 5))
(A 10)
15
(A 10)
25

создадим такую функцию

(define (make-accumulator balance)
  (λ (amount)
    (begin
      (set! balance (+ balance amount))
      balance)))

make-accumulator создает функцию с счетчиком равным balance и возвращает ее.
Функция от одного аргумента amount добавляет аргумент к результату и возвращает результат.