;; CALTECH CS1 Fall 2007
;; Higher Order Procedures
;; Scheme code used in lecture 6 (10/17/2007)
;; Mike Vanier (mvanier@cs.caltech.edu)

;; Recursive sum
(define (sum f low high)
  (if (> low high) 0
      (+ (f low)
         (sum f (+ low 1) high))))

;; Iterative sum
(define (isum f low high)
  (sum-iter f low high 0))

;; Helper procedure for isum
(define (sum-iter f low high subtotal)
  (if (> low high) subtotal
      (sum-iter f (+ low 1) high (+ subtotal (f low))) ))

;; isum using an internal procedure
(define (isum f low high)
  (define (sum-iter f low high subtotal) ; internal procedure
    (if (> low high) subtotal
        (sum-iter f (+ low 1) high (+ subtotal (f low))) ))
  (sum-iter f low high 0))

;; Generalized sum
(define (gsum f low next high)
  (if (> low high) 0
      (+ (f low)
         (gsum f (next low) next high))))

;; Redefining sum in terms of gsum
(define (step1 n) (+ n 1))
(define (sum f low high)
  (gsum f low step1 high))

(define (mult2 n) (* n 2))
(define (sum2 f low high)
  (gsum f low mult2 high))

;; Using lambda
(define (sum2 f low high)
  (gsum f low (lambda (n) (* n 2)) high))

;; More lambda...
(gsum (lambda (n) (* n n n n))
      1
      (lambda (n) (+ n 5))
      100)

;; Integrals
(define (integral f a b dx)
  (* dx
     (gsum f a (lambda (x) (+ x dx)) b)))

