;;; $Id: product-tail-recursive.scm,v 1.2 2005/12/30 18:11:06 leavens Exp $ (module product-tail-recursive (lib "typedscm.ss" "typedscm") (provide product product-of-list product-of-list-traced) (deftype product (-> ((list-of number)) number)) (define product (lambda args (product-of-list args 1))) (deftype product-of-list (-> ((list-of number) number) number)) (define product-of-list (lambda (lon acc) (cond ((null? lon) acc) ((zero? (car lon)) 0) (else (product-of-list (cdr lon) (* (car lon) acc)))))) (deftype product-of-list-traced (-> ((list-of number) number) number)) (define product-of-list-traced (lambda (lon acc) (displayln ";; = (product-of-list '" lon " " acc ")") (cond ((null? lon) (displayln ";; = " acc) acc) ((zero? (car lon)) (displayln ";; = 0") 0) (else (product-of-list-traced (cdr lon) (* (car lon) acc)))))) ;; = (product-of-list '(3 4 2 1 1 5 9 8 7 3 2) 1) ;; = (product-of-list '(4 2 1 1 5 9 8 7 3 2) 3) ;; = (product-of-list '(2 1 1 5 9 8 7 3 2) 12) ;; = (product-of-list '(1 1 5 9 8 7 3 2) 24) ;; = (product-of-list '(1 5 9 8 7 3 2) 24) ;; = (product-of-list '(5 9 8 7 3 2) 24) ;; = (product-of-list '(9 8 7 3 2) 120) ;; = (product-of-list '(8 7 3 2) 1080) ;; = (product-of-list '(7 3 2) 8640) ;; = (product-of-list '(3 2) 60480) ;; = (product-of-list '(2) 181440) ;; = (product-of-list '() 362880) ;; = 362880 ;; (product-of-list '(3 4 2 0 1 5 9 8 7 3 2) 1) ;; = (product-of-list '(4 2 0 1 5 9 8 7 3 2) 3) ;; = (product-of-list '(2 0 1 5 9 8 7 3 2) 12) ;; = (product-of-list '(0 1 5 9 8 7 3 2) 24) ;; = 0 ) ;; end module