Transcript
Algoritmos e Estruturas de Dados
Recursividade Conceituação Um módulo pode ser ativado a partir de qualquer módulo
Recursividade
Quando um módulo faz chamada a si mesmo dizemos que fez uma chamada recursiva Para entendermos recursão veremos a definição de funções/equações de recorrência
Prof. Patrick Pedreira
Recursividade Vejamos um exemplo de uma função simples (F) e de uma função recorrente (R): F(x) = 10 * x + 2 R(x) = 10 * R(x-1) + 2 para x >1, e R(x)=1 para x=1 Vejamos a resolução para os valores 1, 2, 3 e 4.
Função de recorrência é uma função expressa em função de si mesma, ou seja, a resolução da função implica uma resolução anterior da função para outro valor
Recursividade F(1)=10*1+2=12 F(2)=10*2+2=22 F(3)=10*3+2=32 F(4)=10*4+2=42 R(1)=1 por definição, ou base R(2)=10*R(1)+2=10*1+2=12 R(3)=10*R(2)+2=10*12+2=122 R(4)=10*R(3)+2=10*122+2=1222
A resolução da função recorrente R para valores maiores que 1 só é possível após a resolução da função anterior.
1 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade
Recursividade
Vejamos a resolução de R(4) se antes não tivéssemos resolvido as equações anteriores R(4)=10*R(3)+2
fib(0) = 0 e fib(1) = 1
=10*(10*(10*R(1)+2)+2)+2 =10*(10*(10*1+2)+2)+2
R(1)=1
=10*(10*(12)+2)+2
R(2)=12
=10*(122)+2
R(3)=122
=1220+2 R(4)=1222
Recursividade
=x*
xn-1
(base)
Fatorial n! = n * (n-1)! 0! = 1
para n>0;
(base)
Mesmo operações que à primeira vista não parecem ser recursivas, muitas vezes podem ser expressas como funções recursivas.
Recursividade
Exponenciação (expressa por multiplicações) xn
Fibonacci fib(n) = fib(n-1) + fib(n-2) para n>1;
=10*(10*R(2)+2)+2
=1222
Alguns exemplos de funções recursivas
para n>0;
x0=1 (base)
Multiplicação (expressa por adições) x*y=x+x*(y-1) para n>0 x*0=0 (base)
Recursividade expressa por módulos Do ponto de vista algorítmico, recursividade nada mais é do que a ativação de um módulo por si mesmo. O módulo ativador e o ativado são os mesmos
Temos que entender que, apesar de ser o mesmo código que está sendo ativado, não é o mesmo módulo em execução, e sim uma réplica dele. Cada módulo tem seu próprio espaço de memória, sua própria pilha e assim por diante. No inicio/final de um módulo recursivo, assim como em qualquer módulo, suas variáveis são empilhadas/desempilhadas
2 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade
Recursividade
Formato genérico de um módulo recursivo Recursivo (r1: inteiro): inteiro
Problema – Encontrar o fatorial de um número utilizando recursividade Vejamos como seria a implementação de um módulo iterativo
var v1, v2: inteiro;
Fatorial_Iterativo(fat: inteiro): inteiro
início
var aux: inteiro;
v2Recursivo(v1);
início aux 1;
{0! = 1 base}
enquanto (aux < fat) faça
fim
início
O problema da estrutura anterior é que esse módulo nunca se encerra
fat fat * aux; aux aux + 1;
Para que o processo recursivo chegue ao final, é necessário que haja um ponto de parada. Esse ponto explicita a saída do módulo
Recursividade
fim retorne(fat);
fim
Recursividade
Fatorial_Recursivo(fat: inteiro): inteiro
Observações
var fat: inteiro; início se (n=0) então {base} fat 1; senão fat n * Fatorial_Recursivo(n-1); retorne(fat);
O algoritmo recursivo é mais compacto e simples de se construir do que o iterativo {função recorrente)
fim Principal():neutro var fatorial, num: inteiro; início
Vejamos o acompanhamento do algoritmo através de uma pilha
escreva(“Entre com o valor a ser calculado o fatorial: ”); leia(“num”); fatorial Fatorial_Recursivo(num); escreva(“O fatorial é: ”, fatorial); fim
3 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade
Recursividade
Recursividade
Recursividade
4 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade
Recursividade
Recursividade
Recursividade
5 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade A resoluç resolução do mó módulo recursivo tem 2 fases: a primeira é a de preparaç preparação, quando os mó módulos vão sendo alocados recursivamente, de forma sucessiva, até até se chegar ao ponto base. Neste momento, todos os valores da equaç equação recorrente estão empilhados em funç função de valores menores da pró própria equaç equação. Ao se resolver a equaç equação para o valor base, começ começa-se a segunda fase, a de resoluç resolução de equaç equações empilhadas. Apó Após a resoluç resolução da base, o valor é utilizado para resolver a equaç equação recorrente para o valor imediatamente sucessivo.
Recursividade Este processo se repete, resolvendo equaç equações intermediá intermediárias até até chegar à equaç equação original desejada. Mesmo processo utilizado para resolver a equaç equação recorrente R(x) = 10 * R(x-1) + 2 para x >1, e R(x)=1 para x=1
Recursividade Problema – multiplicar por meio de adiç adição utilizando mó módulos
Recursividade Problema – multiplicar por meio de adiç adição utilizando mó módulos
x*y=x+x*(y-1) para n>0
x*y=x+x*(y-1) para n>0
x*0=0 (base)
x*0=0 (base)
6 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.
Recursividade
Recursividade
Problema – multiplicar por meio de adiç adição utilizando mó módulos x*y=x+x*(y-1) para n>0 x*0=0 (base)
7 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.