Escolar Documentos
Profissional Documentos
Cultura Documentos
Tamariz
Captulo 4
Algoritmos Recursivos
Recursividade Aulas de Estrutura de Dados I
Informaes da matria Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
Annabell D.R. Tamariz LCMAT-CCI www.lcmat.uenf.br/professores/annabell Universidade Estadual do Norte Fluminense - UENF
4.1
Ementa
Abstrao de Dados. Alocao Esttica e Dinmica. Listas lineares. Pilhas e Filas: Algoritmos Recursivos.
4.2
Contedo Programtico
1 Algoritmos Recursivos
3 Prxima Aula....
4.3
Introduo
Recursividade
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
algoritmo que para resolver um problema divide-o em subproblemas mais simples, cujas solues requerem a aplicao dele mesmo.
A linguagem C permite que um programador escreva
problema) mediante uma seqencia nita de operaes em que o objeto de cada uma o resultado da que a precede
4.4
Introduo
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
4.5
Introduo
recurso, na qual as rotinas so conectadas atravs de uma cadeia de chamadas sucessivas que acaba retornando primeira que foi chamada: R1 = [C1, R2] R2 = [C2, R3] R3 = [C3, R4] ....... Rn = [Cn, R1]
4.6
Recursividade
4.7
Introduo
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
dela prpria.
Exemplo da aritmtica que d a denio dos nmeros
naturais:
primeiro natural o zero. sucessor de um nmero natural um nmero natural.
4.8
Recursividade - Exemplo
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
Se se atingiu o cimo das escadas, a tarefa subir as escadas est, obviamente terminada; Caso contrrio, se o cimo no tiver sido atingido:
1 2 3
Avanar um degrau, na direo do cimo das escadas e Retomar a tarefa subir as escadas. Notar que ao retomar a tarefa, a dimenso do problema diminuiu, pois j se avano mais um degrau.
4.9
Recursividade - Exemplo
Algoritmo Iterativo
1
Exerccio
Seguindo a idia de subir as escadas, como caria uma funo em C para somar os nmeros menores do que 10? (Fazer em forma recursiva e iterativa)
4.10
Recursividade
Algoritmo Iterativo/Recursivo
#include<stdio.h> int iterativa(int i){ int total=0; while i<10 { total += i; i++ } return total; } int recursiva(int i){ if i<10 return i+recursiva(i+1); return 0;}
4.11
Recursividade
Algoritmo Iterativo/Recursivo
int main() { printf(" $nIterativa :%i $nRecursiva: %i",iterativa(0),recursiva(0)); getchar(); return 0;}
Aplicaes
4.12
Recursividade
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
novo conjunto de variveis locais e de parmetros alocado, e somente esse novo conjunto pode ser referenciado dentro dessa chamada.
Quando ocorre um retorno de uma funo recursiva
para um ponto numa chamada anterior, a alocao mais recente dessas variveis liberada, e a cpia anterior reativada.
4.13
Recursividade
Condies da Recursividade Todo algoritmo deve ser executado em tempo nito, isto
looping que ser executado innitamente, necessrio que ela esteja condicionada a uma expresso lgica (T) que, em algum instante, tornar-se- falsa e permitir que a recurso termine.
4.14
Recursividade
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
igual ao problema original, sendo, porm menor. A soluo, neste caso, pode ser obtida por uma chamada recursiva R(x-1).
4.15
Recursividade - Exemplo
Informaes da matria
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
Soluo trivial : 0! = 1 (dada por denio); Soluo geral : n! = n * (n-1)! (requer reaplicao da rotina para (n-1)!) Considerando f(n) = n, ento n=0 implica numa condio de parada do mecanismo recursivo, garantindo o trmino do algoritmo que calcula o fatorial.
4.16
Recursividade O algoritmo recursivo para computar n! Pode ser diretamente traduzido numa funo em C.
Algoritmo Recursivo do Factorial
#include<stdio.h> int fatorial(n) { if (n==0) return 1; return n*fatorial(n-1);} int main(){ printf("%i",fatorial(4)); getchar();}
4.17
Recursividade
4.18
Recursividade
4.19
Exerccios no Computador
4.20
Aplicaes
teramos que comparar as possveis solues: recursiva e iterativa!!!. Enquanto alguns problemas tm soluo imediata com o uso da recurso, outros ao praticamente impossveis de se resolver de forma recursiva.
preciso analisar o problema e vericar se realmente
4.21
Aplicaes
Algoritmos Recursivos
Conceito de Recursividade Caractersticas Exerccios Aplicaes
atravs de uma pilha criada e mantida, automaticamente, pelo sistema (como visto na denio de pilhas).
Na verdade quando uma rotina evocada, no apenas
o endereo de retorno empilhado, mas todas as suas variveis locais so tambm recriadas na pilha.
Para compreender a relao existente entre recurso e
o uso de pilhas, vamos denir uma rotina recursiva para imprimir em ordem decrescente uma lista que foi ordenada de forma crescente.
4.22
Recursividade
4.23
Aplicaes
Pilhas e rotinas recursivas Perceba que, para imprimir de forma decrescente uma
lista ordenada, basta imprimir em ordem decrescente todos os seus elementos, exceto o primeiro deles; que ser impresso logo em seguida.
Cada vez que uma chamada recursiva funo Show()
executada, uma nova verso da varavel L criada para armazenar o valor e L.prox.
Assim, a chamada recursiva faz com que sejam
guardados na pilha os endereos de todos os nodos da lista, at que no haja mais nodos (lista vazia).
Neste momento, as chamadas recursivas comeam a
retornar o controle para a instruo writeln(...), que vai imprimindo os elementos da lista, um a um, em ordem inversa.
4.24
Aplicaes
Pilhas e rotinas recursivas fcil perceber que a recurso na rotina Show() tem
como nico objetivo simular uma pilha, onde os endereos dos nodos devem aguardar at que os elementos possam ser impressos.
Agora vamos obter o mesmo efeito da rotina Show(),
4.25
Aplicaes
4.26
Aplicaes
Exemplo da Pilha
4.27
Aplicaes
vrias pilhas for necessrio para realizar a converso da verso recursiva para a iterativa, talvez seja melhor permanecer com a rotina recursiva.
Um algoritmo claro, simples e conciso vale mais que
4.28
Exerccios em Sala
Implementar em C um algoritmo para preencher recursivamente um vetor de inteiros de 10 posies com o valor 1 Implementar em C um algoritmo para imprimir recursivamente o vetor de inteiros de 10 posies
4.29
Exerccios em Sala
Soluo
#include<stdio.h> intvetor[10 ;] void preencheVetor(int indice) { if(indice<10) { vetor[indice + + =1;] preencheVetor(indice); } } void imprimeVetor(int indice) { If (indice<10) { printf("%i ",vetor[indice++ );] imprimeVetor(indice); } }
4.30
Exerccios em Sala
Informaes da matria
Soluo - Continuao
Algoritmos Recursivos
Conceito de Recursividade Caractersticas
Exerccios Aplicaes
4.31
1 2
4.32