Beruflich Dokumente
Kultur Dokumente
Introduo
Um objeto dito recursivo se ele consistir parcialmente ou for definido em termos de si prprio Em termos de programao, um subprograma recursivo quando ele chama a si prprio no decorrer de seu cdigo, seja de forma direta ou indireta Em geral, um subprograma recursivo R pode ser expresso como uma composio formada por um conjunto de comandos C (que no contm chamadas a R) e uma chamada (recursiva) ao subprograma R: R[C,R]
Recurso direta
2
Introduo
Entretanto, pode-se ter tambm uma forma indireta de recurso, na qual os subprogramas so conectados atravs de uma cadeia de chamadas sucessivas que acaba retornando a primeira que foi chamada: R1 [C1,R2] R2 [C2,R3] R3 [C3,R4] ... Rn [Cn,R1]
3
Introduo
comum associar um conjunto de objetos locais a um subprograma, isto , um conjunto de variveis, constantes e tipos localmente definidos no subprograma em questo, e que no tenha nem significado nem existncia fora do subprograma Toda vez que tal subprograma ativado recursivamente, um novo conjunto de variveis locais criado
Introduo
Como ocorre no caso dos comandos de repetio, os subprogramas recursivos introduzem a possibilidade de ocorrncia da no terminao dos comandos, sendo, portanto, necessrio considerar o problema da terminao Um requisito fundamental, que chamadas recursivas R sejam sujeitas a uma condio B Um esquema de algoritmo recursivo pode, portanto, ser expresso mais rigorosamente por meio de uma das duas seguintes formas:
Introduo
A tcnica bsica para garantir o trmino da execuo de um algoritmo recursivo consiste em:
Exprimir B em termos de uma funo f(x), tal que f(x) <= 0 implica em uma condio de parada Mostrar que f(x) decresce a cada passo da repetio, isto :
R(x) se f(x) > 0 ento R(x-1); C R(x) C; se f(x) > 0 ento R(x-1)
Introduo
soluo trivial: dada por definio; isto , no necessita de recurso para ser obtida
soluo geral: parte do problema que em essncia igual ao problema original, sendo porm menor
A soluo, neste caso, pode ser obtida por uma chamada recursiva R(x-1)
Introduo
Por exemplo, vamos definir uma funo recursiva para calcular o fatorial de um nmero natural:
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*0! Caso de soluo trivial 0!=1
4!
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*0! 1
10
4!
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*1 1 1
11
4!
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2 2!=2*1 1!=1*1 1 1
12
4!
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2 6 2 2!=2*1 1!=1*1 1 1
13
4!
Exemplo: clculo de 4!
Substituies sucessivas 4!=4*6 24 6 2 3!=3*2 2!=2*1 1!=1*1 1 1
14
4!
Exemplo: clculo de 4!
Problema a ser resolvido 24 4!=4*6 24 6 2 3!=3*2 2!=2*1 1!=1*1 1 1
15
Substituies sucessivas
16
Introduo
O produto a * b, em que a e b so inteiros positivos, pode ser definido como a somado a si mesmo b vezes (definio iterativa) Uma definio recursiva equivalente :
xy = 1, se y = 0 xy = x * xy-1, se y > 0
18
Torres de Hani
Torre A
Torre B
Torre C
19
Torres de Hani
Torre A
Torre B
Torre C
20
Torres de Hani
Torre A
Torre B
Torre C
21
Torres de Hani
Torre A
Torre B
Torre C
22
Torres de Hani
Torre A
Torre B
Torre C
23
Torres de Hani
Torre A
Torre B
Torre C
24
Torres de Hani
Torre A
Torre B
Torre C
25
Torres de Hani
Torre A
Torre B
Torre C
26
Torres de Hani
Soluo trivial: n = 1, transfira o disco da torre A para a torre C e pare Soluo geral:
Transfira n-1 discos da torre A para torre B, usando C como auxiliar Transfira o ltimo disco da torre A para torre C Transfira n-1 discos da torre B para a torre C, usando A como auxiliar
27
Nmero par:
0 par P/ n > 1, n par se n-1 mpar 1 mpar P/ n > 1, n mpar se n-1 par
Nmero mpar
29
Algoritmos recursivos so particularmente apropriados quando o problema ou os dados a que se destinam forem definidos em termos recursivos
Isto no significa, no entanto, que tais definies recursivas garantam ser um algoritmo recursivo a melhor maneira de resolver o problema
Na maioria dos casos no preciso utilizar recursividade, pois de um modo geral todo programa recursivo pode ser escrito de forma no-recursiva (iterativa), entretanto, em algumas situaes ela realmente oportuna
31
A recurso, se bem utilizada, pode tornar um algoritmo muito elegante, isto , claro, simples e conciso (reduo do cdigo-fonte) Porm, o uso de recursividade apresenta algumas desvantagens, tais como:
32
Programas onde a recurso deve ser evitada so aqueles que apresentam o que se chama recurso de cauda
A chamada recursiva est no final de seu cdigo, tendo como nica funo criar um lao
33
lao
soluo geral: Fibn = Fibn-1 + Fibn-2, p/ n>1 soluo trivial: Fib1 = 1, Fib0 = 0
35
36
Deve-se evitar o uso de recurso sempre que for conhecida uma soluo bvia que utilize a tcnica de iterao
Entretanto, isto no dever levar a uma rejeio incondicional do uso da tcnica de recurso
Algoritmos que, por natureza, forem recursivos devem ser formulados como rotinas recursivas
37
Referncias Bibliogrficas
WIRTH, Niklaus. Algoritmos e Estruturas de Dados. Prentice-Hall do Brasil, 1989. TENENBAUM, A.M.; LANGSAM, Y.; AUGENSTEIN, M.J.. Estruturas de Dados Usando C. Makron Books, 1995. VELOSO, P. et al. Estruturas de Dados. Editora Campus, 1986.
38