Escolar Documentos
Profissional Documentos
Cultura Documentos
Recursividade
Recursividade
Conceito de Recursividade
Fatorial := 1
1
Fatorial := 1 * (Fatorial(0)) Fatorial = 1
1
Fatorial := 2 * (Fatorial(1)) Fatorial = 2
2
Fatorial := 3 * (Fatorial(2)) Fatorial = 6
Fatorial := 4 * (Fatorial(3))
6 Fatorial = 24
Problema com terminação de
Procedimentos Recursivos
• Procedimentos recursivos introduzem a possibilidade de
iterações que podem não terminar: existe a necessidade de
considerar o problema de terminação.
• Condição de terminação
– Permite que o procedimento deixe de ser executado
– O procedimento deve ter pelo menos um caso básico para
cada caso recursivo, o que significa a finalização do
procedimento
Outro Exemplo - Busca em uma Lista
Linear Ordenada
• Pode-se realizar a busca em um elemento de
duas formas:
– Busca Seqüencial
– Busca Binária
• Busca Seqüencial: elementos são pesquisados
de acordo com o índice
– Pior caso: o elemento está no último índice do meu
vetor.
– Imagine realizar uma busca seqüencial em uma Lista
Telefônica!
Busca Seqüencial
Procurar por R
A C E H L M P R T Z
-8 Comparações!
-Se eu estivesse procurando o item Z, o número de comparações
seria a quantidade de elementos no vetor
-O ideal seria dividir o vetor pela metade para então procurar (Busca
Binária)
Busca Binária
Procurar por R
1 2 3 4 5 6 7 8 9 10
A C E H L M P R T Z
I X I X F
-2 Comparações!
-Casos piores: quando os itens estiverem no início do vetor. Nesse
caso, seria melhor utilizar busca seqüencial. Mas como saber quando
o ítem está no início do vetor?
Busca Binária
Procedure Busca_Binária(L: TipoLista; x: TipoItem; Inicio, Fim: integer);
Var
meio: integer;
Begin
meio := (inicio + fim) div 2;
If fim < inicio then
Writeln (‘Elemento Não Enontrado’)
Else If (L.Item[meio]) = x then
Writeln (‘Elemento está na posição ’ + meio)
Else
If L.Item[meio] < x then begin
inicio := meio +1;
Busca_Binaria (L, x, inicio, fim);
end else
fim := meio - 1;
Busca_Binaria (L, x, inicio, fim);
end;
End;
Dicas