08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

notas de aula -<br />

Jerônimo C. Pellegrini<br />

O procedimento list-insert primeiro verifica se o índice que recebeu está dentro<br />

de limites aceitáveis e depois chama list-insert-aux:<br />

( define list-insert<br />

( lambda ( elt lst pos )<br />

(if (or ( negative pos )<br />

(> pos ( length lst )))<br />

( error " list-insert : pos is too far ahead ")<br />

( list-insert-aux elt lst pos ))))<br />

Esta versão do procedimento não é recursiva na cauda porque há nele uma chamada<br />

recursiva <strong>com</strong>o argumento para cons:<br />

( cons ( car lst )<br />

( list-insert ...)<br />

Este uso de cons é necessário para que o procedimento se lembre, em cada chamada<br />

recursiva, dos elementos à esquerda da posição atual. Este procedimento pode ser transformado<br />

em outro, recursivo na cauda, que chamaremos de list-insert-tail-rec. O<br />

procedimento list-insert-tail-rec-aux receberá um argumento adicional, left, e o<br />

usará para lembrar-se de que elementos ficaram para a esquerda da posição atual. Como<br />

em cada chamada recursiva faremos left ser igual a (cons (car lst) left), o argumento<br />

left será a lista à esquerda invertida. Para apresentar o resultado final, podemos<br />

então concatenar (reverse left) <strong>com</strong> (cons elt lst):<br />

( define list-insert-tail-rec-aux<br />

( lambda ( elt lst pos left )<br />

(if (= pos 0)<br />

( append ( reverse left )<br />

Versão Preliminar<br />

( cons elt lst ))<br />

( list-insert-tail-rec-aux elt<br />

( cdr lst )<br />

(- pos 1)<br />

( cons ( car lst ) left )))))<br />

( define list-insert-tail-rec<br />

( lambda ( elt lst pos )<br />

(if (or ( negative pos )<br />

(> pos ( length lst )))<br />

( error " list-insert : pos is too far ahead ")<br />

26<br />

[ 27 de outubro de 2010 at 15:47 ]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!