FEUP - LEIC - Introdução à Programação de Computadores I
Mini-teste em 11 de Dezembro de 2000
Duração: 45 min


1.
Analisar o procedimento x.

   (define x
      (lambda (y)
         (cond
            ((null? y) 1)
            ((and (odd? (car y)) 
                  (not (negative? (car y))))
             (* (car y) (x (cdr y))))
            (else (x (cdr y))))))

Escolher um nome apropriado para o procedimento x e justificar essa escolha.

produto-dos-pares-não-negativos

2.
Considere o seguinte programa.

  > (quantos-de-cada '(1 2 34 2 5 6 7 6 8 3 41 500 5))
((1 1) (2 2) (3 1) (5 2) (6 2) (7 1) (8 1) (34 1) (41 1) (500 1))

  > (quantos-de-cada '(115))
((115 1))


  (define quantos-de-cada
     (lambda (lista)
        (if (null? lista) 
            '()
            (let ((m (apply min lista)))
               (cons
                  (list m (conta m lista))
                  (quantos-de-cada (retira m lista))
               )))))
  ; dá o número de ocorrência do elemento e na lista lis
  (define conta
     ...

  ; dá a lista que se obtém da lista lis retirando todas as ocorrências do 
  ; elemento e
  (define retira
     ...

  ;;não era pedido!!!
  (define retira
     (lambda (e lis)
        (cond ((null? lis) '())
           ((= (car lis) e) (retira e (cdr lis)))
           (else (cons (car lis) (retira e (cdr lis)))))))

a) Completar o procedimento quantos-de-cada.

b) Definir o procedimento conta.

  (define conta
     (lambda (e lis)
        (cond ((null? lis) 0)
           ((equal? e (car lis)) (add1 (conta e (cdr lis))))
           (else (conta e (cdr lis))))))