Sie sind auf Seite 1von 38

Recursividade

Neste tpico ser abordado o conceito de recursividade e suas implicaes.

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:

R se B ento R; C RC; se B ento R


5

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)

onde x decresce a cada chamada

Introduo

Na prtica, ao definir um subprograma recursivo, dividimos o problema da seguinte maneira:

soluo trivial: dada por definio; isto , no necessita de recurso para ser obtida

Esta parte do problema resolvida pelo conjunto de comandos C

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:

Soluo trivial: 0! = 1 Soluo geral: n!=n*(n-1)!

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!

Caso de soluo trivial 0!=1

Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*1 1 1
11

4!

Caso de soluo trivial 0!=1

Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2! 2 2!=2*1 1!=1*1 1 1
12

4!

Caso de soluo trivial 0!=1

Exemplo: clculo de 4!
Substituies sucessivas 4!=4*3! 3!=3*2 6 2 2!=2*1 1!=1*1 1 1
13

4!

Caso de soluo trivial 0!=1

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!

Caso de soluo trivial 0!=1

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

Caso de soluo trivial 0!=1

Funo recursiva para o clculo do fatorial


longlongfat(intn){ if(n==0) { return1; } return(n*fat(n1)); }

16

Introduo

Outro exemplo: definio da multiplicao de nmeros naturais

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 :

soluo trivial: a * b = a, para b = 1 soluo geral: a * b = a * (b-1) + a, para b >1


17

Exemplos de Problemas Recursivos

Quociente da diviso inteira de 2 inteiros


a div b = 0, se b > a a div b = 1 + (a-b) div b, se a b

Clculo da exponenciao de dois nmeros naturais (xy)


xy = 1, se y = 0 xy = x * xy-1, se y > 0
18

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

19

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

20

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

21

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

22

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

23

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

24

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

25

Exemplos de Problemas Recursivos

Torres de Hani

Torre A

Torre B

Torre C

26

Exemplos de Problemas Recursivos

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

Funo em C que resolve o problema das Torres de Hani


voidhanoi(intn,charorig,charaux,chardest){ if(n==1){ printf("Movaodisco1datorre%cparaa torre%c\n",orig,dest); } else{ hanoi(n1,orig,dest,aux); printf("Movaodisco%ddatorre%cparaa torre%c\n",n,orig,dest); hanoi(n1,aux,orig,dest); } }
28

Exemplo de Recurso Indireta

Definio Recursiva para Determinar se um Nmero Par ou mpar

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

Exemplos de Recurso Indireta


boolpar(intn){ if(n==0)returntrue; if(n==1)returnfalse; returnimpar(n1); } boolimpar(intn){ if(n==1)returntrue; if(n==0)returnfalse; returnpar(n1); }
30

Quando no se Deve Empregar a Recurso

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

Quando no se Deve Empregar a Recurso

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:

Baixo desempenho na execuo Dificuldade na depurao dos programas

32

Quando no se Deve Empregar a Recurso

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

Exemplo de recurso de cauda: clculo do fatorial


longlongfat(intn){ if(n==0){ return1; } return(n*fat(n1)); }
34

lao

Quando no se Deve Empregar a Recurso

Clculo dos nmeros de Fibonacci

soluo geral: Fibn = Fibn-1 + Fibn-2, p/ n>1 soluo trivial: Fib1 = 1, Fib0 = 0

35

Exemplo de uma chamada a fib(4)


fib(4) fib(3) fib(2) fib(1) fib(0) fib(1) fib(1) fib(2) fib(0)

36

Quando no se Deve Empregar a Recurso

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

Das könnte Ihnen auch gefallen