Sie sind auf Seite 1von 53

Recurso

Recurso
uma tcnica de programao na qual um mtodo (funo) chama a si mesmo. um algoritmo que para resolver um problema divide-o em subproblemas mais simples, cujas solues requerem a aplicao dele mesmo.

Fundamentos
Uma rotina recursiva R pode ser expressa como uma composio formada por um conjunto de comandos C (que no contm chamadas a R) e uma chamada (recursiva) rotina R:
R= [C , R ]

Exemplos
Fatorial Fibonacci Nmeros Triangulares Pesquisa Binria Torre de Hanoi E outros

Usando recurso na soluo de problemas


Todo algoritmo deve ser executado em um tempo finito terminar aps ter executado uma quantidade finita de passos. Para garantir que uma chamada recursiva no criar um looping infinito, necessrio que ela seja condicionada a uma expresso lgica que em algum momento se tornar falsa, terminando a recurso.

Tcnica
Uma rotina recursiva melhor representada por: R= [C,T R], onde T R indica que a rotina R somente ser chamada se o teste T for satisfeito. Exprimir T como uma funo f(x), tal que f(x)<= 0 implica uma condio de parada. Mostrar que f(x) decresce a cada passo de repetio. R(x)= [C, (f(x)>0 R(x-1)]

Tcnica
Divida o problema da seguinte maneira: Soluo trivial dada por definio no necessita de recurso para ser obtida. Esta parte resolvida pelo conjunto de comandos C. Soluo geral : parte do problema que em essncia igual ao problema original, porm menor. Aquela que pode levar a recurso.

Fatorial
O Fatorial de um nmero n encontrado multiplicando n pelo fatorial de n-1. Soluo trivial : 0! = 1 {dada por definio} Soluo geral : n!= n*(n-1)!
{requer reaplicao da rotina para (n-1)!}

Fatorial
Considerando f(n) = n e sendo n=0 implica em uma condio de parada.
int fatorial(int n){ if (n == 0) return 1; else return (n * fatorial(n 1) ); }

Fibonacci
A srie 1, 1, 2, 3, 5, 8, ... A srie formada pela soma de dois termos.
1+1=2+1=3+2=5

Soluo trivial : fib(1) = 1 e fib(2) = 1 Soluo geral : fib(n) = fib(n-1) + fib(n-2)

Exerccios
Implemente a abordagem recursiva para o clculo da potncia. Implemente a abordagem recursiva para a multiplicao de um nmero.

Nmeros Triangulares
Dada a seqncia: 1, 3, 6, 10, 15, 21... Qual ser o prximo termo? O ensimo termo na srie obtido adicionando n ao termo anterior. Assim o segundo termo encontrado adicionando 2 ao primeiro (que 1), dando 3. O terceiro 3 adicionada ao segundo termo (que 3) dando 6, etc.

Nmeros triangulares
So chamados triangulares porque eles podem ser visualizados como uma organizao triangular de objetos.

Encontrando o ensimo termo


Suponha que voc quer o valor do ensimo termo arbitrrio na srie o quarto por exemplo. Como calcular?
O Valor de qualquer termo pode ser obtido somando todas as colunas verticais de quadrados. Somar 4+3+2+1 = 10

Nmeros triangulares
int triangular(int n) { int total = 0; while (n > 0) { total = total + n; --n; } return total; }

// at n ser 1
// some n (altura da coluna) ao total // decrementa a altura da coluna

Usando recurso
O valor do ensimo pode ser considerado como a soma de apenas:
A primeira coluna (mais alta), que tem o valor de n. A soma de todas as colunas restantes int triangular(int n){ return (n + somaAnteriores(n)); // verso incompleta }

Usando recurso
A soma das outras restantes para o termo n igual soma de todas as colunas para o termo n-1.
int triangular(int n) { return (n + somaOutras(n-1) ); //verso incompleta }

Usando recurso
Mas somaOutras est fazendo a mesma coisa que triangular
int triangular(int n) { return (n + triangular(n-1)); }

Quando ir parar?
Quando chegar em 1.

Usando recurso
int triangular(int n) { if (n==1) return 1; else return ( n + triangular(n-1); }

Esquema da recurso
Verso 1

Chamando com o n=3

n=3 Verso 2
n=2 Verso 3 n=1 Retorna 1 Adiciona 2 Retorna 3 Adiciona 3 Retorna 6

Retorna 6

Caractersticas
Chama a si mesmo. Faz isso para resolver um problema menor. H alguma verso do problema que simples o bastante para que a rotina possa resolv-lo e retornar sem chamar a si mesmo. (condio de parada ou case base)

Induo matemtica
triangular(n) = 1 se n = 1 triangular(n) = n + triangular(n-1) se n>1 Definir algo em termos de si mesmo pode parecer circular, mas perfeitamente vlido (contanto que haja um case base)

Algoritmos do tipo dividir-econquistar


Divide o problema grande em dois menores e resolve cada um separadamente. Para cada problema menor divide-se novamente em dois problemas menores e resolve-os. O processo continua at que chegue ao caso base.

Algoritmos do tipo dividir-econquistar


Envolve um mtodo que contm duas chamadas recursivas a si mesmo, uma para cada metade do problema. Exemplos:
Busca-binria Ordenao por intercalao

Pesquisa em vetor
Pesquisa linear Pesquisa Binria Padro de pesquisa Dividir para conquistar Busca seqencial at o fim se vetor no Dividir a faixa de ordenado e at um possveis valores pela elemento de maior metade at encontrar o valor se vetor ordenado. nmero.

Pesquisa Binria
0 5 7 8 9 12 15 0 5 7 8 9 12 15

?
0

Testa com primeiro e ltimo

Encontra elemento do meio e testa se igual, maior ou menor

12 15

Encontra do meio menor

Pesquisa binria
Passo 0 1 2 3 4 5 6 7 50 25 37 31 34 32 33 Alto demais Baixo demais Alto demais Baixo demais Alto demais Baixo demais Correto Nmero adivinhado Resultado Faixa de possveis 1-100 1-49 26-49 26-36 32-36 32-33 33-33

Ordenando por intercalao


Dividir um vetor ao meio; Ordenar cada metade e
Recursivamente divide a metade em dois quartos, ordena cada um dos quartos e intercala-os.

Ento usar o mtodo merge() para intercalar as duas metades em um nico vetor ordenado.

Intercalao Mergesort
Idia central Intercalao de dois vetores j ordenados criando um terceiro.
23 47 81 95 7 14 23 39 47 55 62 74 81 95 7 14 39 55 62 74

Operaes de intercalao
Passo 1 2 3 4 5 6 7 8 9 10 Comparao (se houver) Compara 23 e 7 Compara 23 e 14 Compara 23 e 39 Compara 39 e 47 Compara 55 e 47 Compara 55 e 81 Compara 81 e 62 Compara 81 e 74 Cpia Copia 7 de B para C Copia 14 de B para C Copia 23 de A para C Copia 39 de B para C Copia 47 de A para C Copia 55 de B para C Copia 62 de B para C Copia 74 de B para C Copia 81 de A para C Copia 95 de A para C

Ordenando por Intercalao


Dividir um vetor ao meio Ordenar cada metade E ento utilizar a intercalao anterior Como ordenar cada metade?

Usando Recurso

Intercalao
82 70 11 72 25 36 44 10

82

70

11

72

25

36

44

10

82

70

11

72

25

36

44

10

82

70

11

72

25

36

44

10

Intercalao
82 70 11 72 25 36 44 10

70

82

11

72

25

36

10

44

11

70

72

82

10

25

36

44

10

11

25

36

44

70

72

82

Torre de Hanoi
H um antigo mito de que em algum lugar na ndia, em um templo remoto, os monges trabalham dia e noite para transferir 64 discos de ouro de uma das trs torres com pinos de diamante para outra. Quando eles terminarem, o mundo acabar.

Torre de Hanoi
um antigo quebra-cabea que consiste em vrios discos colocados em trs colunas. Os discos tm dimetros diferentes e orifcios no meio, de modo a se encaixar sobre as colunas.Todos os discos comeam na coluna A. Objetivo: transferir todos os discos da coluna A para a coluna C. Apenas um disco de cada vez e nenhum disco pode ser colocado sobre um disco menor que si mesmo.
Simulao

O algoritmo recursivo
Suponha que se queira mover todos os discos de uma torre-fonte (F) para uma torre destino (D). Tem-se uma intermediria disponvel (I). Assuma que h n discos na torre (F):

Mova a subrvore que consiste dos n-1 discos superiores de F para I

Mova o disco restante (maior) de F para D.

Mova a subrvore de I para D.

Exerccios
Defina uma funo recursiva para determinar o maior divisor comum entre dois nmeros naturais x e y, baseando-se nas regras abaixo. Em seguida, apresente uma verso iterativa do algoritmo capaz de realizar a mesma tarefa.
mdc(x,y) = x mdc(x,y) = mdc(y,x) mdc(x,y) = mdc(x-y,y) se x=y se x<y se x>y

Exerccios
Defina uma funo booleana recursiva para verificar se uma palavra palndroma. Uma palavra palndroma aquela que pode ser lida da esquerda para a direita ou vice-versa.
Exemplo: ANA, SOMOS, OVO, ARARA, A2882A

Exerccio
Dado o algoritmo para a busca binria, transforme-o em uma rotina recursiva

Recurso
Exerccio Desafio

Combinaes : selecionando uma equipe


Uma combinao uma seleo de coisas nas quais sua ordem no importa. Suponha que haja um grupo de cinco montanhistas denominados A, B, C, D e E. A partir desse grupo, deseja-se selecionar uma equipe de trs (3) para escalar um determinado monte. Voc precisa listar todas as possveis equipes; ou sejas todas as combinaes possveis de trs montanhistas.

Combinando...
Tal programa mostrarias as 10 possveis combinaes: ABC, ABD, ABE, ACD, ACE, ADE, BCD, BCE, BDE, CDE Como escrever este programa? Usando uma soluo recursiva.

Soluo recursiva
Dividir essas combinaes em dois grupos: os que comeam com A e aqueles que no. Suponha que se abrevie a idia de 3 pessoas selecionadas a partir de um grupo de 5 como (5,3). Digamos que n o tamanho do grupo e k o tamanho de uma equipe.

Teorema
Um teorema diz que :
(n,k) = (n-1, k-1) + (n-1, k)

Para o exemplo, temos:


(5,3) = (4,2) + (4,3)

Divide-se o problema grande em dois menores: primeiro, todas as maneiras de selecionar 2 pessoas de um grupo de 4, ento todas as maneiras de selecionar 3 pessoas de um grupo de 4.

Termo esquerdo
H 6 maneiras de selecionar 2 pessoas de um grupo de 4. No termo (4,2), que chamaremos de termo esquerdo, estas combinaes so:
BC, BD, BE, CD, CE, DE

A o membro do grupo ausente, portanto, para criar equipes com trs pessoas, antecedemos essas combinaes com A.
ABC, ABD, ABE, ACD, ACE, ADE

Termo direito
H 4 maneiras de selecionar 3 pessoas de um grupo de 4. Termo direito.
BCD, BCE, BDE, CDE

Quando essas 4 combinaes do termo direito forem adicionadas s 6 do termo esquerdo, teremos 10 combinaes para (5,3)

Recurso
Pode-se aplicar o mesmo processo de decomposio em cada um dos grupos de 4.
(4,2) = (3,1) + (3,2)

Recurso Caso Base 0 e tamanho > que a equipe no so vlidos.


(1,1) vlido mas no h razo para divid-lo

Recurso
A medida que percorre a recurso, descendo, ser necessrio lembrar a seqncia de membros visitados. Sempre que fizer uma chamada para um termo esquerda, registre o n que est deixando acionando sua letra a uma seqncia. Ser preciso percorrer de volta a seqncia quando retornar.

Continuando...
Para registrar todas as combinaes, poder exibi-las medida que avana. No exibir nada quando fizer chamadas esquerda. Porm quando fizer chamadas direita, ir verificar a seqncia; se estiver em um n vlido e adicionar um membro completar a equipe, ento adicione o n seqncia e exiba a equipe completa.

Implementando
Procure agora, baseado na explicao implementar esta soluo.

Das könnte Ihnen auch gefallen