Skip to content

Instantly share code, notes, and snippets.

@MikeMKH
Created September 14, 2016 11:36
Show Gist options
  • Save MikeMKH/a0633d67904fe1cb031e5a98c1257d8c to your computer and use it in GitHub Desktop.
Save MikeMKH/a0633d67904fe1cb031e5a98c1257d8c to your computer and use it in GitHub Desktop.
Prime Factors kata in Racket using recursion
#lang racket
(require rackunit rackunit/text-ui)
(define (prime-factors n)
(define (factors acc canidate x)
(if (equal? 1 x)
(reverse acc)
(if (zero? (modulo x canidate))
(factors (cons canidate acc) canidate (quotient x canidate))
(factors acc (add1 canidate) x))))
(factors empty 2 n))
(run-tests
(test-suite
"prime factorization tests"
(test-case
"given a prime number it must return given prime number"
(for/list ([prime '(2 5 7 11 13 17 23)])
(check-equal? (prime-factors prime) (list prime))))
(test-case
"given a prime number times 2 it must return 2 and given prime number"
(for/list ([prime '(2 3 5 17)])
(check-equal? (prime-factors (* 2 prime)) (list 2 prime))))
(test-case
"given a complex number the product of its prime factors must equal given complex number"
(for/list ([complex '(100 33 45 109872)])
(check-equal? (apply * (prime-factors complex)) complex)))
(test-case
"given 1 its prime factors must be none"
(check-pred empty? (prime-factors 1)))
(test-case
"given a complex number its prime factors must be sorted in ascending order"
(for/list ([complex '(1010 10202 3333208 109872)])
(let ([factors (prime-factors complex)])
(check-equal? (sort factors <) factors))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment