2010-06-29 3 views
0

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

(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)))) 

Проблема 1: х^п ; Решение: рекурсивный без накопления

(define (expon x n) 
    (if (> n 0) (* x 
       (expon x (- n 1)) 
      ) 
       1)) 

задачи 2: х + х^2 + x^4 + x^6 + ... +, вычислим для данного n первые n элементов последовательности.

проблема 3: 1 + x/1! + x^2/2! + ... + x^n/n !; вычислить сумму для заданных х, п возможно неправильное решение:

(define (exp1 x n) 
(define (term i) 
    (define (term1 k) (/ x k)) 
    (accumulate * 1 term1 1 1+ i)) 
    (accumulate + 0 term 1 1+ n)) 

почему предыдущий код неверен:

(exp1 0 3) -> 0; Это должно быть 1 (exp1 1 1) -> 1; Это должно быть 2

ответ

3

Во-первых, я хотел бы сказать, что ваша процедура EXP1 работает на слишком низком уровне определяется в терминах ACCUMULATE, и ради прозорливости переписать его вместо с точки зрения сумм и факториалов :

 
(define (sum term a b) 
    (accumulate + 0 term a 1+ b)) 

(define (product term a b) 
    (accumulate * 1 term a 1+ b)) 

(define (identity x) x) 

(define (fact n) 
    (if (= n 0) 
     1 
     (product identity 1 n))) 

(define (exp1 x n) 
    (define (term i) 
    (/ (expon x i) (fact i))) 
    (sum term 1 n)) 

Теперь на ваш вопрос: почему вы получаете (EXP1 0 3) → 0 не больше, чем вы забыли добавить 1 в начале серии, и только вычисления х/1! + x^2/2! + ... + x^n/n!

Изменение EXP1 включить недостающий термин работает, как ожидалось:

 
(define (exp1 x n) 
    (define (term i) 
      (/ (expon x i) (fact i))) 
    (+ 1 (sum term 1 n))) 

=> (exp1 0 3) 
1 
=> (exp1 1 1) 
2 

 Смежные вопросы

  • Нет связанных вопросов^_^