Escolar Documentos
Profissional Documentos
Cultura Documentos
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
PC = 1 A = 7 ... PC = 1 9
B=3 ...
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) ?
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
349
Recursividade
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