;; simple definition of factorial: ;; this will run into trouble due to precision (define (factorial-1 num) (if (= num 0) 1 (* num (factorial-1 (- num 1))))) ;; factorial using imported GMP package: ;; it works better but runs into trouble with too deep call stack (load "gmp.lsp") (define (factorial-gmp num) (if (= num 0) "1" (GMP:* (string num) (factorial-gmp (- num 1))))) ;; Finally, a trampoline style recursive definition of ;; factorial which simulates tail recursive implementation ;; avoiding call stack overflow (define (factorial-acc num acc) (if (= num 0) (land (string acc)) (bounce factorial-acc (- num 1) (GMP:* (string num) (string acc))))) (define (factorial-trampoline num) (trampoline factorial-acc num 1)) (define (trampoline func num acc) (set 'bouncer (bounce func num acc)) (catch (while 1 (set 'bouncer (bouncer)) (if (not (lambda? bouncer)) (throw bouncer))))) (define (bounce) (letex (func (args 0) num (args 1) acc (args 2)) (lambda() (func num acc)))) (define (land val) val)
You need to create an account or log in to post comments to this site.