#lang racket (require rackunit) (require rackunit/text-ui) ;; Exemplo 1 ;; ;; Dado um número natural n, defina uma função soma, que some os números ;; naturais até n. ;; Natural -> Natural ;; Soma todos os números naturais de 0 até n. (define soma-tests (test-suite "soma tests" (check-equal? (soma 0) 0) (check-equal? (soma 1) 1) ; (+ 1 0) (check-equal? (soma 3) 6))); (+ 3 (+ 2 (+ 1 0))) (define (soma n) (cond [(zero? n) 0] [else (+ n (soma (sub1 n)))])) ;; Exemplo 2 ;; ;; Usando apenas as funções primitivas zero?, add1 e sub1, defina a função mais ;; que soma dois números naturais. ;; Natural Natural -> Natural ;; Soma dois números naturais usando as operações primitivas zero?, add1 e ;; sub1. (define mais-tests (test-suite "soma tests" (check-equal? (mais 3 0) 3) (check-equal? (mais 0 4) 4) (check-equal? (mais 4 2) 6))) (define (mais a b) (cond [(zero? b) a] [else (add1 (mais a (sub1 b)))])) ;; Exemplo 3 ;; ;; Usando apenas as funções primitivas zero?, add1 e sub1, defina a função ;; menor que verifica se um número natural é menor que outro. ;; Natural Natural -> Boolean ;; Devolve verdadeiro se a < b, caso contrário falso. Usa apenas ;; as funções zero? e sub1. (define menor-tests (test-suite "menor tests" (check-equal? (menor 0 0) #f) (check-equal? (menor 3 0) #f) (check-equal? (menor 0 4) #t) (check-equal? (menor 2 7) #t) (check-equal? (menor 7 2) #f))) (define (menor a b) (cond [(and (zero? a) (zero? b)) #f] [(zero? a) #t] [(zero? b) #f] [else (menor (sub1 a) (sub1 b))])) ;; Exemplo 4 ;; ;; [htdp 11.4.7] Escreva uma função nao-divisivel-<=i, que receba como ;; parâmetros dois números naturais, i e n, onde i < n. Se n não é divisível ;; por nenhum número entre 1 (exclusive) e i (inclusive), a função deve ;; devolver verdadeiro, caso contrário falso. Utilizando a função ;; nao-divisivel-<=i, defina uma função primo?, que verifica se um número ;; natural é primo. Um número natural é primo se ele tem exatamente dois ;; divisores distintos: 1 e ele mesmo. ;; Natural Natural -> Boolean ;; Devolve verdadeiro se n não é divisível por nenhum valor no intervalo ;; (1, i], falso caso contrário. (define nao-divisivel-<=i-tests (test-suite "nao-divisivel-<=i tests" (check-equal? (nao-divisivel-<=i 5 4) #t) (check-equal? (nao-divisivel-<=i 10 9) #f) (check-equal? (nao-divisivel-<=i 49 48) #f) (check-equal? (nao-divisivel-<=i 49 6) #t))) (define (nao-divisivel-<=i n i) (cond [(= i 1) #t] [(divisivel? n i) #f] [else (nao-divisivel-<=i n (sub1 i))])) ;; Natural -> Boolean ;; Devolve verdadeiro se n é um número primo, falso caso contrário. (define primo?-tests (test-suite "primo? tests" (check-equal? (primo? 1) #f) (check-equal? (primo? 2) #t) (check-equal? (primo? 3) #t) (check-equal? (primo? 4) #f) (check-equal? (primo? 5) #t) (check-equal? (primo? 20) #f) (check-equal? (primo? 23) #t))) (define (primo? n) (cond [(<= n 1) #f] [else (nao-divisivel-<=i n (sub1 n))])) ;; Natural Natural -> Boolean ;; Devolve verdadeiro se n é divisível por d, falso caso contrário. (define (divisivel? n d) (= (remainder n d) 0)) ;; --------------------------------------------------------------------- ;; 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 soma-tests mais-tests menor-tests nao-divisivel-<=i-tests primo?-tests)