#lang racket (require rackunit) (require rackunit/text-ui) ;; Exercício 1 ;; Natural > Lista de pares ;; Cria uma lista de pares (i, j) com 1 ≤ j < i ≤ n. Cada par é representado ;; por uma lista com os dois elementos do par. (define unique-pairs-tests (test-suite "unique-pairs tests" (check-equal? (unique-pairs 1) empty) (check-equal? (unique-pairs 2) (list (list 2 1))) (check-equal? (unique-pairs 3) (list (list 2 1) (list 3 1) (list 3 2))) (check-equal? (unique-pairs 4) (list (list 2 1) (list 3 1) (list 3 2) (list 4 1) (list 4 2) (list 4 3))))) ;; Definição com for/list aninhado ;; É necessário aplicar a função apply append para juntar as listas. #; (define (unique-pairs n) (apply append (for/list ([i (in-range 1 (add1 n))]) (for/list ([j (in-range 1 i)]) (list i j))))) ;; Definição com for*/list (define (unique-pairs n) (for*/list ([i (in-range 1 (add1 n))] [j (in-range 1 i)]) (list i j))) ;; Exercício 4 ;; -> Stream(Natural) ;; Cria um stream de números primos. (define cria-stream-primos-tests (test-suite "cria-stream-primos tests" (check-equal? (stream-ref (cria-stream-primos) 0) 2) (check-equal? (stream-ref (cria-stream-primos) 1) 3) (check-equal? (stream-ref (cria-stream-primos) 2) 5) (check-equal? (stream-ref (cria-stream-primos) 3) 7) (check-equal? (stream-ref (cria-stream-primos) 4) 11))) (define (cria-stream-primos) (define (sieve s) (define n (stream-first s)) (define (nao-divisivel-n? x) (not (zero? (remainder x n)))) (stream-cons n (sieve (stream-filter nao-divisivel-n? s)))) (define primos (sieve (in-naturals 2))) primos) ;; --------------------------------------------------------------------- ;; Função que executa um grupo de testes. (define (executar-testes . testes) (run-tests (test-suite "Todos os testes" testes)) (void)) ;; Chama a função para executar os testes. (executar-testes unique-pairs-tests cria-stream-primos-tests)