Você está na página 1de 13

Recursividade Alguns problemas so definidos com base nos mesmos, ou seja, podem ser descritos por instncias do prprio

problema. Para tratar estas classes de problemas, utilizase o conceito de recursividade. Um mdulo recursivo um mdulo que em sua seo de comandos chama a si mesmo. Uma grande vantagem da recursividade o fato de gerar uma reduo no tamanho do algoritmo, permitindo descrev-lo de forma mais clara e concisa.
339

Recursividade
Porm, todo cuidado pouco ao se fazer mdulos recursivos. A primeira coisa a se providenciar um critrio de parada, o qual vai determinar quando o mdulo dever parar de chamar a si mesmo. Este cuidado impede que o mdulo se chame infinitas vezes. Um exemplo de um problema passvel de definio recursiva a operao de multiplicao efetuada sobre nmeros naturais. Podemos definir a multiplicao em termos da operao mais simples de adio.
340

Recursividade

No caso A*B pode ser definido como A + A * (B - 1) precisamos agora especificar um critrio de parada. Qual seria? A*0=0

341

Recursividade
De acordo com o que vimos at o momento, podemos implementar um lao de repetio que implementaria o clculo da operao de multiplicao com base na operao de adio. Definiremos agora este lao: ... A, B, RES: inteiro ... RES<-0 enquanto (B<>0) faca RES <- RES + A B<-B-1 fimenquanto 342 ...

Recursividade
Com base no que vimos podemos, tambm, definir um mdulo recursivo que implemente a operao de multiplicao com base na operao de adio:
funcao multiplicar (A: inteiro; B: inteiro): inteiro inicio se (B=0) entao retorne (0) senao retorne (A + multiplicar (A, B-1)) fimse fimfuncao
343

Recursividade Para uma melhor compreenso do que foi apresentado, devemos compreender o conceito de registro de ativao. O registro de ativao uma rea de memria que guarda informaes referentes ao estado atual de um mdulo ou do prprio algoritmo: - valor dos parmetros (para mdulos); - valor das variveis locais (para mdulos); - valor do contador de programa (PC); - etc.
344

Recursividade Sempre que um mdulo chamado o registro de ativao de quem o invocou (do algoritmo principal ou de um outro mdulo) salvo e um novo registro de ativao criado para o mdulo invocado. Estes registros de ativao so empilhados em uma pilha de registros de ativao. Este processo conhecido como salvamento e troca de contexto e pode ser melhor compreendido se o aplicarmos sobre um algoritmo que se utilize do mdulo recursivo multiplicar definido anteriormente.
345

algoritmo "exemplo recursividade" var A, B, RES: inteiro funcao multiplicar (A: inteiro; B: inteiro): inteiro inicio 1 se (B=0) entao 2 retorne (0) 3 senao 4 retorne (A + multiplicar (A, B-1)) 5 fimse fimfuncao inicio 1 repita 2 escreva ("Multiplicando (valor natural): ") 3 leia (A) 4 ate (A>=0) 5 repita 6 escreva ("Multiplicador (valor natural): ") 7 leia (B) 8 ate (B>=0) 9 RES <- multiplicar(a,b) 10 escreva (a," *",b," =",res) fimalgoritmo 346

Recursividade
Para melhor contextualizar nossa explicao vamos presumir que o usurio forneceu o valor 7 para A e 3 para B. Inicialmente o registro de ativao do algoritmo colocado na pilha de registros de ativao. Em nosso exemplo a primeira execuo de um mdulo ocorre na nona instruo da seo de comandos do algoritmo. Neste momento salvo o registro de ativao do algoritmo e introduzido na pilha um novo registro de ativao referente ao mdulo chamado.
347

RES <- multiplicar (7,3) ?

PC = 1 A = 7 ... PC = 1 9

B=3 ...

Pilha de registros de ativao

Recursividade
Devido ao valor contido no parmetro B a quarta instruo da seo de comandos do mdulo executada chamando novamente o mdulo multiplicar. Neste momento salvo um registro de ativao (RA) do invocador e introduzido na pilha um novo RA. Devido ao valor contido no parmetro B a quarta instruo da seo de comandos do mdulo executada chamando novamente o mdulo multiplicar. Neste momento salvo o RA do invocador e introduzido na pilha um novo RA.
RES <- multiplicar (7,3) ? 7 + multiplicar (7,2) ? 7 + multiplicar (7,1) ?

PC = 1 A = 7 ... PC = 4 1 A=7 ... PC = 4 1 A=7 ... PC = 9

B=1 B=2 B=3 ...

Pilha de registros de ativao

348

Recursividade
Devido ao valor contido no parmetro B a quarta instruo da seo de comandos do mdulo executada chamando novamente o mdulo multiplicar. Neste momento salvo o RA do invocador e introduzido na pilha um novo RA. Devido ao valor contido no parmetro B a segunda instruo da seo de comandos do mdulo executada retornando o valor zero e finalizando as chamadas recursivas. Neste momento salvo o RA do invocador e introduzido na pilha um novo RA.
RES <- multiplicar (7,3) ? 7 + multiplicar (7,2) ? 7 + multiplicar (7,1) ? 7 + multiplicar (7,0) ? 0

PC = 1 A = 7 ... PC = 4 1 A=7 ... PC = 4 A = 7 ... PC = 4 A = 7 ... PC = 9

B=0 B=1 B=2 B=3 ...

Pilha de registros de ativao

349

Recursividade

Desta forma um a um os mdulos vo sendo finalizados e seus registros de ativao desempilhados.

RES <- 21 7 + 14 7+7 7+0 0

PC = 4 A = 7 ... PC = 4 A = 7 ... PC = 4 A = 7 ... PC = 9

B=1 B=2 B=3 ...

Pilha de registros de ativao


350

Recursividade
Com base no que foi exposto, podemos visualizar algumas desvantagens da utilizao de recursividade, como: - O consumo de memria necessrio para a troca de contexto. - Reduo do desempenho de execuo devido ao tempo para gerenciamento de chamadas. - Dificuldades na depurao de programas recursivos, especialmente se a recurso for muito profunda. Exerccio 47: Para uma melhor compreenso do conceito de recursividade faa agora um mdulo recursivo para calcular o fatorial de um nmero natural e construa um algoritmo que o utilize de forma adequada. 351

Você também pode gostar