#lang racket ; Estes são alguns exemplos feitos em sala de aula. ; A maioria dos exemplos não faz tratamento de erro dos parâmetros, ; assim, fica mais claro a excência da função. (require rackunit) ; Funções para auxiliar nos testes (define => 'arrow) (define (fact result arrow expected) (unless (equal? arrow =>) (fail "O segundo deve ser =>")) (check-equal? result expected)) ; Fatorial sem recursão em cauda (define (fat n) (cond [(= n 0) 1] [(= n 1) 1] [(> n 1) (* n (fat (sub1 n)))])) (fact (fat 0) => 1) (fact (fat 1) => 1) (fact (fat 4) => 24) ; Fatorial com recursão em cauda (define (fat-acc n) (define (iter acc n) (if (= n 1) acc (iter (* acc n) (sub1 n)))) (cond [(= n 0) 1] [(= n 1) 1] [(> n 1) (iter 1 n)])) (fact (fat-acc 0) => 1) (fact (fat-acc 1) => 1) (fact (fat-acc 4) => 24) ; Fibonacci sem recursão em cauda (define (fib n) (cond [(= n 0) 0] [(= n 1) 1] [(> n 1) (+ (fib (- n 1)) (fib (- n 2)))])) (fact (fib 0) => 0) (fact (fib 1) => 1) (fact (fib 2) => 1) (fact (fib 3) => 2) (fact (fib 6) => 8) ; Fibonacci com recursão em cauda (define (fib-acc n) (define (iter a b i) (if (> i n) a (iter b (+ a b) (+ i 1)))) (cond [(>= n 0) (iter 0 1 1)])) (fact (fib-acc 0) => 0) (fact (fib-acc 1) => 1) (fact (fib-acc 2) => 1) (fact (fib-acc 3) => 2) (fact (fib-acc 6) => 8) ; Testa se um número é primo (define (divide? d n) (zero? (remainder n d))) (define (encontrar-divisor n d) (cond [(>= d n) d] [(divide? d n) d] [else (encontrar-divisor n (add1 d))])) (define (primo? n) (= (encontrar-divisor n 2) n)) (fact (primo? 1) => #f) (fact (primo? 2) => #t) (fact (primo? 3) => #t) (fact (primo? 4) => #f) (fact (primo? 5) => #t)