Problem 11.2 from the book.

Note that I have changed some of the code that is given in the book so that cond is used instead of if and (count-ums 1) calls (count-ums 0).

(#%require racket/trace)
(define (count-ums0 sent)
  0)
(define (count-ums1 sent)
  (cond ((equal? 'um (first sent)) (+ 1 (count-ums0 (bf sent))))
        (else (count-ums0 (bf sent)))))
(define (count-ums2 sent)
  (cond ((equal? 'um (first sent)) (+ 1 (count-ums1 (bf sent))))
        (else (count-ums1 (bf sent)))))
(define (count-ums3 sent)
  (cond ((equal? 'um (first sent)) (+ 1 (count-ums2 (bf sent))))
        (else (count-ums2 (bf sent)))))

; count-ums takes a sentence as its input and returns the number of times
; the word 'um appears in the sentence
; > (count-ums '(cow um i forgot um what i was um going to say))
; 3
;
; Recursive procedure is a procedure that calls itself
; It has two properties:
; * At least one recursive call (i.e., where it calls itself)
; * At least one base case (i.e., where does the function stop)

(define (count-ums sent)
  (cond ((empty? sent) 0)
        ; if the first word is 'um...
        ((equal? (first sent) 'um) (+ 1 (count-ums (bf sent))))
        ; if it isn't...
        (else  (count-ums (bf sent)))))
(trace count-ums)