; ICC 00.2 PROVA 3 ; Gabarito ; QUESTAO 1 (1 ponto) (árvores binárias) ; Complete os espaços em branco na definição abaixo de maneira que ; a função receba uma Árvore Binária de números e retorne o número ; de folhas da árvore associadas a valores superiores a 10. ; (conta-folhas ( )) ; -> 0 ; (conta-folhas '(12 (3 1 10) (50 27 100))) ; -> 2 ; A manipulação da árvore deve ser feita empregando-se apenas as ; operações básicas de Árvores Binárias (vazia?, raiz, esquerda, ), ; que não precisam ser definidas. ;(define conta-folhas ; (lambda ( ) ; (cond ; ( ( ) ) ; ( (and ) ) ; ( else ; ) ) )) (define ab '(12 (3 1 10) (50 27 100))) (define arv-bin-vazia '( )) (define arv-bin-vazia? null?) (define folha? (lambda (ab) (not (list? ab)))) (define raiz (lambda (ab) (if (folha? ab) ab (car ab) ))) (define esquerda (lambda (ab) (if (folha? ab) arv-bin-vazia (cadr ab) ))) (define direita (lambda (ab) (if (folha? ab) arv-bin-vazia (caddr ab) ))) (define conta-folhas (lambda ( ab) (cond ( (arv-bin-vazia? ab) 0) ( (and (folha? ab) (> (raiz ab) 10)) 1) (else (+ (conta-folhas (esquerda ab)) (conta-folhas (direita ab)) )) ) )) (conta-folhas '( )) ; -> 0 (conta-folhas '(12 (3 1 10) (50 27 100))) ; -> 2 ; QUESTAO 2 (2 pts.) (árvores binárias de busca) ; Complete os espaços em branco na definição abaixo de maneira ; que a função receba um número e uma Árvore Binária de Busca ; contendo apenas números e retorne a sub-árvore cuja raiz esteja ; associada ao número dado ou uma árvore vazia se o número dado ; não ocorrer na árvore dada. ; (sub-abb 5 '(12 (3 1 10) (50 27 100))) ; -> ( ) ; (sub-abb 12 '(12 (3 1 10) (50 27 100))) ; -> (12 (3 1 10) (50 27 100)) ; (sub-abb 3 '(12 (3 1 10) (50 27 100))) ; -> (3 1 10) ; A manipulação da árvore deve ser feita empregando-se apenas as ; operações básicas de Árvores Binárias (vazia?, raiz, esquerda, ),
; que não precisam ser definidas. ;(define sub-abb ; (lambda ( ) ; (cond ; ( ( ) ) ; ( ( ) ) ; ( ( ) ) ; ( else ) ) )) (define sub-abb (lambda (elem abb) (cond ( (arv-bin-vazia? abb) arv-bin-vazia) ( (equal? (raiz abb) elem) abb) ( (< elem (raiz abb)) (sub-abb elem (esquerda abb))) (else (sub-abb elem (direita abb))) ) )) (sub-abb 5 '(12 (3 1 10) (50 27 100))) ; -> ( ) (sub-abb 12 '(12 (3 1 10) (50 27 100))) ; -> (12 (3 1 10) (50 27 100)) (sub-abb 3 '(12 (3 1 10) (50 27 100))) ; -> (3 1 10) ; QUESTAO 3 (3 pts.) (vetores e árvores binárias de busca; procedimentos) ; O objetivo desta questão é escrever em Scheme um procedimento ; que permita exibir, separados por um espaço em branco, ; os elementos de um Vetor de números que estejam também contidos ; em uma Árvore Binária de Busca. ; (exibe-vet '#(5 2 7 8 9) '(12 (3 1 10) (50 27 100))) ; -> ; (exibe-vet '#(5 3 7 100 27) '(12 (3 1 10) (50 27 100))) ; -> 3 100 27 ; (3a -- 1 pt.) ; Escreva em Scheme uma função que receba um número e uma Árvore ; Binária de Busca contendo apenas números e verifique se o número ; está contido na árvore dada. ; (pertence? 5 '(12 (3 1 10) (50 27 100))) ; -> #f ; (pertence? 27 '(12 (3 1 10) (50 27 100))) ; -> #t ; A manipulação da árvore deve ser feita empregando-se apenas as operações ; básicas de Árvores Binárias (vazia?, raiz, esquerda, ), que não precisam ; ser definidas. (define pertence? (lambda (elem abb) (cond ( (arv-bin-vazia? abb) #f) ( (equal? elem (raiz abb)) #t) ( (< elem (raiz abb)) (pertence? elem (esquerda abb))) ( else (pertence? elem (direita abb))) ) )) '3a
(pertence? 5 '(12 (3 1 10) (50 27 100))) ; -> #f (pertence? 27 '(12 (3 1 10) (50 27 100))) ; -> #t ; (3b -- 2 pts.) ; Complete os espaços em branco do procedimento abaixo de ; maneira que ele exiba, no formato acima definido, os ; elementos do vetor v também contidos na árvore binária de ; busca abb. ;(define exibe-vet-aux ; (lambda (v abb ) ; (if (not ( )) ; (begin ; (if (pertence? ) ; (begin ; ( ) ; ( ) ) ) ; ( ) ) ))) ;(define exibe-vet ; (lambda (v abb) ; ( ) )) (define exibe-vet-aux (lambda (v abb i) (if (not (>= i (vector-length v))) (begin ( if (pertence? (vector-ref v i) abb) (begin ( display (vector-ref v i)) (display " ") ) ) (exibe-vet-aux v abb (+ i 1)) ) ))) (define exibe-vet (lambda (v abb) (exibe-vet-aux v abb 0) )) (display '3b) (exibe-vet '#(5 2 7 8 9) '(12 (3 1 10) (50 27 100))) ; -> (exibe-vet '#(5 3 7 100 27) '(12 (3 1 10) (50 27 100))) ; -> 3 100 27 ; QUESTÃO 4 (3 pts.) (listas; procedimentos interativos) ; O objetivo desta questão é escrever em Scheme um procedimento ; que leia uma seqüência de números e exiba essa seqüência colocando ; os números entre parênteses e separados por vírgulas, obedecendo ; a ordem de leitura. Para isso, resolva os itens a seguir. ; (4a -- 1pt.) ; Escreva em Scheme uma função que leia uma seqüência de números e ; retorne uma lista com os números lidos, obedecendo a ordem de ; leitura.
; A leitura deverá ser terminada quando for lido o símbolo fim. ; O usuário deverá fornecer dado em resposta a um alerta do tipo ; numero ou fim?. Por exemplo: ; numero ou fim? 2 ; numero ou fim? 3 ; numero ou fim? fim ; (2, 3) ; Processo recursivo ( recursão "normal" ) (define lista-numeros-aux (lambda ( ) (let ( (resp (begin (display "numero ou fim? ") (read) ))) (if (equal? resp 'fim) '( ) (cons resp (lista-numeros-aux)) ) ) )) (define lista-numeros (lambda ( ) ( lista-numeros-aux))) ; Processo iterativo ( recursão "final" ) (define inverte-lista-it-aux (lambda ( lista ac) (if (null? lista) ac (inverte-lista-it-aux ( cdr lista) (cons (car lista) ac) ) ) )) (define inverte-lista-it (lambda ( lista) (inverte-lista-it-aux lista '( )) )) (define lista-numeros-it-aux (lambda (ac) (let ( (resp (begin (display "numero ou fim? ") (read) ))) (if (equal? resp 'fim) ac (lista-numeros-it-aux (cons resp ac)) ) ) )) (define lista-numeros-it (lambda ( ) (inverte-lista-it ( lista-numeros-it-aux '( ))) )) ; (4b -- 1pt.) ; Escreva em Scheme um procedimento que receba uma lista e ; exiba os itens da lista entre parênteses, separados por ; vírgulas e repeitando a ordem da lista. ; (mostra-seq '( )) ; -> ( ) ; (mostra-seq '(a b c d)) ; -> (a, b, c, d) (define mostra-itens (lambda ( lista) (if (not (null? lista)) (begin (display (car lista)) (if (not (null? (cdr lista))) (display ", ") ) (mostra-itens (cdr lista)) ) ) ))
(define mostra-seq (lambda ( seq) (begin (display "(") (mostra-itens seq) (display ")") ) )) (display '4b) (mostra-seq '( )) ; -> ( ) (mostra-seq '(a b c d)) ; -> (a, b, c, d) ; (4c -- 1pt.) ; Escreva em Scheme um procedimento que leia uma seqüência ; de números e exiba essa seqüência colocando os números ; entre parênteses e separados por vírgulas, obedecendo a ; ordem de leitura. (define exibe-seq (lambda ( ) (mostra-seq (lista-numeros)) )) (display '4c) (exibe-seq)