Beruflich Dokumente
Kultur Dokumente
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
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
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.
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
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)
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
12 15
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
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
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):
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
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)
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
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.