Exercícios / Paradigma funcional / Funções

  1. [tspl 2.4.1] Reescreva as seguintes expressões usando let para remover as subexpressões em comum e melhorar a estrutura do código. Não faça nenhuma simplificação algébrica.

    (+ (- (* 3 a) b) (+ (* 3 a) b))
    
    
    (cons (car (list a b c)) (cdr (list a b c)))
    
  2. [tspl 2.4.3] Determine o valor da seguinte expressão. Explique como você chegou neste valor.

    (let ([x 9])
      (* x
         (let ([x (/ x 3)])
           (+ x x))))
    
  3. [tspl 2.5.1] Determine o valor da seguintes expressões

    (let ([f (lambda (x) x)])
      (f 'a))
    
    
    (let ([f (lambda x x)])
      (f 'a))
    
    
    (let ([f (lambda (x . y) x)])
      (f 'a))
    
    
    (let ([f (lambda (x . y) y)])
      (f 'a))
    
  4. [tspl 2.5.2] Como o procedimento primitivo list pode ser definido?

  5. [sicp 1.34] Dado a seguinte definição

    (define (f g)
      (g 2))
    

    Então nós temos

    > (f sqr)
    4
    
    
    > (f (lambda (z) (* z (z + 1))))
    6
    

    O que acontecerá se nós (perversamente) pedir ao interpretador para avaliar a combinação (f f). Explique.

  6. [sicp 2.4] A seguir é apresentado uma representação procedural para um par. Para esta representação, verifique que (car (cons x y)) produz x para qualquer objeto x e y.

    (define (cons x y)
      (lambda (m) (m x y)))
    
    
    (define (car z)
      (z (lambda (p q) p)))
    

    Qual é a definição correspondente de cdr? (Dica: para verificar que isto funciona, faça uso do modelo de substituição da seção 1.1.5).

  7. Defina uma função que receba como parâmetro um predicado (função de um argumento que retorna um valor booleano) e uma lista, e conte quantos elementos da lista satisfazem o predicado. Exemplo

    > (cont positive? '(1 -1 2 3 -2 5))
    4
    
  8. Defina uma função append que receba como parâmetro um número variável de listas e calcule a concatenação de todos os parâmetros. Exemplo

    > (append '(1 2 3) '(4) '(5 6))
    '(1 2 3 4 5 6)
    
  9. A função map pré definida no Racket aceita como parâmetro uma função de aridade $n$ e $n$ listas do mesmo tamanho, e aplica a função a todos os primeiros elementos das listas, depois aplica a função a todos os segundos elementos das listas e assim por diante, retornando a lista de resultados. Exemplo

    > (map + '(1 2 3) '(4 5 6) '(7 8 9))
    '(12 15 18)
    

    Implemente esta função map.

  10. [sicp 2.20] Defina uma função que receba um ou mais inteiros como parâmetro e retorne uma lista com os parâmetros que tenha a mesma paridade do primeiro argumento. Exemplo

    > (same-parity 1 2 3 4 5 6 7)
    '(1 3 5 7)
    
    
    > (same-parity 2 3 4 5 6 7)
    '(2 4 6)
    
  11. [sicp 2.40] Defina a função unique-pairs que, dado um inteiro $n$ gere a lista de pares $(i, j)$ com $1 \le j < i \le n$. Cada par é representado por uma lista com os dois elementos do par.

  12. [sicp 2.41] Escreva uma função que encontre todas as triplas ordenadas de inteiros positivos distintos $i, j$ e $k$ menores ou iguais a um dado inteiro $n$ cuja a soma seja igual a um dado inteiro $s$.

  13. Defina uma função que calcule todas as permutações de um dado conjunto (representado por uma lista). Exemplo

    > (permutations '(1 2 3))
    '((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
    
  14. [sicp 1.41] Defina a função double que receba como parâmetro uma função de um parâmetro e retorne uma função que aplique a função original duas vezes. Por exemplo, dado que a função add1 adiciona 1 ao seu parâmetro, então (double add1) retorna uma função que adiciona 2 ao parâmetro. Qual é o valor retornado por

    (((double (double double)) inc) 5)
    
  15. [sicp 1.42] Seja $f$ e $g$ duas funções de 1 argumento. A composição de $f$ depois de $g$ é definida como sendo a função $x \mapsto f(g(x))$. Defina uma função compose que implemente composição. Por exemplo

    > ((compose sqr add1) 6)
    49
    

Referências