;; ----------------------------------------------------------------------- ;; | | ;; | FILE : factorial.rkt | ;; | AUTHOR : Eugene Wallingford | ;; | CREATION DATE : 2024/02/20 | ;; | | ;; | DESCRIPTION : A tail-recursive implementation of factorial. | ;; | The second parameter on factorial-aps is an | ;; | *accumulator variable*. We then define | ;; | factorial as an *interface procedure* that | ;; | calls factorial-aps to do the work. | ;; | | ;; | REQUIRES : Uses Rackunit for testing. | ;; | | ;; ----------------------------------------------------------------------- ;; | | ;; | MODIFIED : | ;; | | ;; ----------------------------------------------------------------------- #lang racket (require rackunit) ; ------------------------------------------------------------------------- ; factorial (tail recursion) ; ------------------------------------------------------------------------- (define factorial-aps (lambda (n answer) (if (zero? n) answer (factorial-aps (sub1 n) (* n answer))))) (check-equal? (factorial-aps 10 1) 3628800) (check-equal? (factorial-aps 40 1) 815915283247897734345611269596115894272000000000) ; ------------------------------------------------------------------------- ; factorial (interface procedure) ; ------------------------------------------------------------------------- (define factorial (lambda (n) (factorial-aps n 1))) (check-equal? (factorial 10) 3628800) (check-equal? (factorial 40) 815915283247897734345611269596115894272000000000) ; ------------------------------------------------------------------------- ;; (require racket/trace) ;; (trace factorial-aps) ;; (factorial-aps 6 1) ; -------------------------------------------------------------------------