Exemplos de recursividade no mundo Imagem recursiva: “o efeito Droste” Definição recursiva de escada Acrônimo recursivo para definir GNU, PHP Refeição recursiva Definição do conjunto dos números naturais Como saber o que é recursão?
Exemplos de recursividade (2) Triângulo de Sierpinski:
Exemplos de recursividade (3) Fractais: Curva de Koch
Recursividade em Programação Um procedimento é dito recursivo quando um de seus passos consiste na chamada de uma nova execução do mesmo procedimento. O procedimento recursivo é expresso como um conjunto de comandos formados por: um grupo de comandos não recursivos, normalmente determinam a parada da recursão, e um grupos de comandos recursivos, que chamam o próprio procedimento.
Exemplos de programas recursivos fatorial (6) 6 * fatorial (5) 6 * 5 * fatorial (4) 6 * 5 * 4 * fatorial (3) 6 * 5 * 4 * 3 * fatorial (2) 6 * 5 * 4 * 3 * 2 * fatorial (1) 6 * 5 * 4 * 3 * 2 * 1 * 1 6 * 5 * 4 * 3 * 2 * 1 6 * 5 * 4 * 3 * 2 6 * 5 * 4 * 6 6 * 5 * 24 6 * 120 720 Cálculo do fatorial de n: int fatorial(int n) { if(n <= 1) return 1; else return n * fatorial(n-1); }
Exemplos de programas recursivos (2) Busca binária (veja a solução da 1ª questão da prova – disponível no site) Análise de complexidade do algoritmo: log2n = k, ou seja a complexidade é de ordem: O(log n) Qtde de elementos (n) Qtde de comparações (k+1) 1 2 3 4 8 16 5 32 6 64 7
Vantagens e desvantagens de programas recursivos Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir com maior clareza o processo utilizado, desde que o problema ou dados sejam naturalmente definidos através da recorrência. Por outro lado, um programa recursivo exige mais espaço de memória e é mais lento do que a versão iterativa. Alguns problemas tem a sua solução naturalmente feitas de forma recursiva: percurso de uma árvore, exemplo lúdico http://www.youtube.com/watch?v=FVkZzdZxEks&feature=related para descobrir a qtde de elementos; busca de informações em estruturas hierárquicas; algoritmos de ordenação como Quicksort.
Vantagens e desvantagens de programas recursivos (2) Enquanto em alguns casos a solução recursiva é bem vinda, em outros casos é até impraticável, como na série de Fibonacci, pois existe uma dupla chamada da recursão exigindo que o processamento seja refeito várias vezes: long fibonacci(long n) { if(n <= 1) return n; else return fibonacci(n-2)+fibonacci(n-1); }
Vantagens e desvantagens de programas recursivos (3) Execute e veja o tempo de cada uma das versões! http://pastebin.com/6aLfbipk Versão iterativa: long fibonacci(long n) { int i, primeiro = 0, segundo = 1, terceiro; if(n <= 0) return 0; if(n == 1) return 1; for(i = 2; i <= n; i++) { terceiro = primeiro + segundo; primeiro = segundo; segundo = terceiro; } return terceiro;
documento cooperativo Exercícios no documento cooperativo disponível no site