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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

notas de aula - Jerônimo C. Pellegrini<br />

Se as chamadas recursivas em um procedimento nunca são usadas <strong>com</strong>o<br />

argumentos para outros procedimentos (ou seja, se toda chamada recursiva<br />

em um procedimento é a última forma a ser avaliada), ele é chamado de<br />

procedimento recursivo na cauda.<br />

O padrão da linguagem <strong>Scheme</strong> obriga toda implementação a otimizar procedimentos<br />

recursivos na cauda de forma a não usar memória adicional em cada chamada recursiva 10 .<br />

O próximo exemplo mostra a transformação de um procedimento não recursivo na<br />

cauda em outro que é, mas sem redução da quantidade de memória necessária.<br />

O procedimento detalhado a seguir recebe um objeto, uma lista e uma posição, e<br />

retorna uma nova lista <strong>com</strong> o objeto incluído naquela posição.<br />

list-insert ’x (list ’a ’b ’c) 0)<br />

(x a b c)<br />

list-insert ’x (list ’a ’b ’c) 2)<br />

(a b x c)<br />

list-insert ’x (list ’a ’b ’c) 3)<br />

(a b c x)<br />

A nova lista a ser retornada por list-insert pode ser definida indutivamente da<br />

seguinte maneira:<br />

• Se a posição é zero, basta retornar (cons elt lst)<br />

• Se a posição não é zero (e portanto o car da lista não será alterado), o procedimento<br />

retorna uma lista <strong>com</strong> o mesmo car e cujo cdr é uma chamada à list-insert-aux –<br />

desta vez passando (cdr lst) e (- pos 1).<br />

A definição indutiva acima é descrita naturalmente em <strong>Scheme</strong> da seguinte maneira:<br />

( define list-insert-aux<br />

( lambda ( elt lst pos )<br />

(if (= pos 0)<br />

( cons elt lst )<br />

( cons ( car lst )<br />

( list-insert-aux elt<br />

Versão Preliminar<br />

( cdr lst )<br />

(- pos 1))))))<br />

10 Esta otimização também é feita por <strong>com</strong>piladores de outras linguagens, mas não é obrigatória para elas<br />

[ 27 de outubro de 2010 at 15:47 ]<br />

25

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

Saved successfully!

Ooh no, something went wrong!