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 pré-fixa $$\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.3] Defina uma função que receba $3$ números como parâmetros e retorne a soma dos quadrados dos dois maiores números.

  7. Utilizando apenas as funções primitivas zero?, add1 e sub1, escreva as funções >, >=, <, <= e =. Cada função deve receber como parâmetro dois números naturais e executar a operação de comparação apropriada.

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

  9. 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$.

  10. Defina uma função div que receba como parâmetro dois números naturais $a$ e $b$ e calcule a divisão inteira de $a$ por $b$. De que maneira o código desta função é diferente do template da função para números naturais? Explique.

Referências