2. Introdução Um método é considerado recursivo quando possui uma chamada para si próprio f(int x){ .... f(x) } Um método recursivo pode ser chamado direta ou indiretamente por outro método. f() -> g() -> f()
3. Introdução Condições para a aplicação da recursividade O problema possa ser decomposto em subproblemas que representem instâncias menores daquele original O processo de decomposição seja finito e limitado, ou seja, a cada nova instância o subproblema resultante é menor que o antecede, e o número de instâncias não seja grande.
4. Introdução Em geral, há dois tipos básicos de problemas que admitem soluções recursivas: Os que são compostos por problemas que apresentam uma decomposição naturalmente recursiva em subproblemas de mesma classe, como o cálculo do fatorial de um número; Os problemas que tratam estruturas de dados naturalmente recursivas, como as listas encadeadas, as árvores ou algoritmos de ordenação como MergeSort, QuickSort
5. Algoritmo Recursivo Algoritmo recursivo Início Se a condição de término for atingida então Resolver o problema senão Partir o problema em problemas mais pequenos, usando para esse efeito, uma ou mais invocações recursivas Fim
6. Algoritmo Recursivo X Não Recursivo Implementação não Recursiva intFatorial (int N){ int i, fat= 1; if(N < 0) return0; // invocação anormal (valor devolvido 0) for (i = 2; i <= N; i++) fat= fat* i; // cálculo do produto returnfat; // devolução do valor calculado }
12. Conclusão Recursão deve ser usada com critério Usualmente é menos eficiente que seu equivalente iterativo Há vantagem em clareza, legibilidade e simplicidade de código. A conversão para uma versão iterativa nem sempre é uma tarefa trivial Métodos recursivos podem ser substituídos por estruturas de pilhas
13. Atividade Dado: Escrever uma função recursiva que eleve qualquer número x a uma potência inteira não negativa n. doube potencia (double x, unsignedint n){ ... ... ... }