Exercícios / Paradigma funcional / Fundamentos

  1. [sicp 1.1] A seguir está uma lista de expressões. Qual é o resultado impresso pelo interpretador em resposta a cada expressão? Assuma que as expressões serão avaliadas na ordem em que são apresentadas.

    10
    
    (+ 5 3 4)
    
    (- 9 1)
    
    (/ 6 2)
    
    (+ (* 2 4) (- 4 6))
    
    (define a 3)
    
    (define b (+ a 1))
    
    (+ a b (* a b))
    
    (= a b)
    
    (if (and (> b a) (< b (* a b)))
        b
        a)
    
    (cond [(= a 4) 6]
          [(= b 4) (+ 6 7 a)]
          [else 25])
    
    (+ 2 (if (> b a) b a))
    
    (* (cond ((> a b) a)
             ((< a b) b)
             (else -1))
       (+ a 1))
  2. [sicp 1.2] Traduza a seguinte expressão para a forma prefixa $$\frac{5 + 4 + (2 - (3 - (6 + \frac{4}{5})))}{3 (6 - 2) (2 - 7)}$$

  3. [tspl 2.2.2] Experimente os procedimentos +, -, * e / e determine as regras do Racket para o tipo do valor de retorno para cada procedimento quando são dados diferentes tipos de argumentos numéricos.

  4. [sicp 1.4] O modelo de avaliação visto em sala permite combinações em que os operadores são expressões compostas. Use está observação para descrever o comportamento do seguinte procedimento:

    (define (a-plus-abs-b a b)
      ((if (> b 0) + -) a b))
  5. [sicp 1.5] Ben Bitdiddle inventou um método para determinar se um interpretador está usando avaliação com ordem aplicativa ou avaliação com ordem normal. Ele definiu os seguintes procedimentos:

    (define (p) (p))
    
    (define (test x y)
      (if (= x 0)
          0
          y))

    Então avaliou a seguinte expressão

    (test 0 (p))

    Qual é o comportamento que Ben irá observar com um interpretador que usa avaliação com ordem aplicativa? Qual é o comportamento que ele irá observar com um interpretador que usa avaliação com ordem normal? Explique a sua resposta.

  6. [sicp 1.9] Cada um dois seguintes procedimentos define um método para adicionar dois inteiros positivos em termos dos procedimentos add1, que incrementa seu argumento por 1, e sub1, que decrementa seu argumento por 1.

    (define (+ a b)
      (if (= a 0)
          b
          (add1 (+ (sub1 a) b))))
    
    (define (+ a b)
      (if (= a 0)
          b
          (+ (sub1 a) (add1 b))))

    Usando o modelo de substituição, ilustre o processo gerado por cada procedimento na avaliação (+ 4 5). Estes procedimentos são iterativos ou recursivos?

  7. [sicp 1.3] Defina uma função que receba 3 números como parâmetros e retorne a soma dos quadrados dos dois maiores números.

  8. [tspl 2.8.6] Recursão indireta é quando dois (ou mais) procedimentos usam um ao outro. Defina dois procedimentos odd? e even?, um em termos do outro. (Dica: O que cada um deve retornar quando o argumento for 0?)

  9. [pp99 2.01] Defina um predicado para determinar se um dado número inteiro positivo é primo.

  10. Defina uma função para determinar quantos números primos existem em um dado intervalo.

  11. Defina uma função para determinar se um dado número inteiro positivo é perfeito. Um número é perfeito se a soma dos seu divisores próprios é igual a ela. Por exemplo, o número 6 é perfeito, pois 6 = 1 + 2 + 3. O número 28 também é perfeito, pois 28 = 1 + 2 + 4 + 7 + 14.

  12. [pp99 2.07] Defina uma função que determine (usando o algoritmo de Euclid) o maior divisor comum de dois números.

  13. [pp99 2.08] Defina uma função que determine se dois número são coprimos. Dois números são coprimos se o maior divisor comum entre eles é 1.

  14. Defina uma função que determine se um dado número inteiro positivo é palíndromo. Um número é palíndromo se permanece o mesmo quando os dígitos são revertidos, ou seja, o número é simétrico. Por exemplo, 72027 é palíndromo.

  15. Defina uma função que receba como parâmetro um número inteiro positivo $n$ e calcule o $n$-ésimo número primo.

Referências