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 />

243<br />

Evidentemente, quanto maior o expoente, mais memória será necessária para armazenar<br />

as operações pendentes de multiplicação. A chamada recursiva a power* é usada<br />

<strong>com</strong>o argumento para *, e somente após a chamada a * o valor é retornado:<br />

(* x ( power * x (- n 1))))))<br />

Após a última chamada recursiva (quando n = 1), o procedimento “volta” da recursão<br />

multiplicando x por um valor que vai crescendo. Podemos modificar o procedimento<br />

para que não seja necessário fazer a multiplicação após a chamada recursiva. usaremos<br />

um argumento extra para o procedimento onde guardaremos o valor acumulado das<br />

multiplicações:<br />

( define power-aux<br />

( lambda (x n acc )<br />

(if (= n 0)<br />

acc<br />

( define power<br />

( power-aux x<br />

( lambda (x n)<br />

(- n 1)<br />

(* x acc )))))<br />

( power-aux x (- n 1) x )))<br />

Esta nova versão do procedimento gera um processo iterativo linear. Não há operações<br />

pendentes durante as chamadas recursivas a power-aux. Quando chamado <strong>com</strong><br />

argumentos 3, 4, 3 as chamadas de procedimento realizadas são:<br />

(power-aux 3 4 3)<br />

(power-aux 3 3 9)<br />

(power-aux 3 2 27)<br />

(power-aux 3 1 81)<br />

(power-aux 3 0 243)<br />

243<br />

Versão Preliminar<br />

O procedimento power-aux precisa de uma quantidade constante de memória, ao<br />

contrário do procedimento power*.<br />

24<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!