(define (factor n) (cond ((negative? n) (cons -1 (factor (- n)))) ((<= n 2) (list n)) (else (let lp ((n n) (limit (inexact->exact (ceiling (sqrt n)))) (res (list))) (cond ((even? n) (lp (quotient n 2) (quotient limit 2) (cons 2 res))) ((= n 1) (reverse res)) (else (let lp ((i 3) (n n) (limit limit) (res res)) (cond ((> i limit) (reverse (cons n res))) ((zero? (remainder n i)) (lp i (quotient n i) (quotient limit i) (cons i res))) (else (lp (+ i 2) n limit res))))))))))