Recursividade

19
Recursividade Raphael Leite Campos IFRS

Transcript of Recursividade

Page 1: Recursividade

Recursividade

Raphael Leite CamposIFRS

Page 2: Recursividade

Nossa Aula de Hoje!Conteúdo

• Lembram de Funções? Que tal revisarmos um pouco?• Objetivos• Definição Recursividade• Como aplicar a Recursão a um problema?• O que compõe uma solução recursiva?• Vamos praticar um pouco!!!• Vamos comparar a abordagem Recursiva Vs Iterativa?

Será que há vantagem de alguma?• Desafio pra Casa (Torre de Hanói)!!!

Page 3: Recursividade

Revisão de Funções

• Funções ou subprogramas – Blocos de instruções que realizam tarefas específicas e repetitivas;

• Objetivo: Subdividir os programas permite uma codificação menor e mais organizada.– diminuindo os efeitos colaterais de erros;– facilita a manutenção do código;– facilita o teste de código.

Page 4: Recursividade

Revisão de Funções

• Como definir uma função?– tipo_retorno nome_funcao(tipo parametro, tipo param){ Corpo função };

Page 5: Recursividade

Objetivos da Aula de Hoje

Aprender o que é recursão, a aplicar a abordagem recursiva para a solução de problemas. Desenvolver uma solução recursiva saber diferenciá-la de uma abordagem iterativa.

Page 6: Recursividade

Definição de Recursividade

Fonte: http://pensamentocomputacional.blogspot.com.br/

Raciocínio Recursivo

Page 7: Recursividade

Definição de Recursividade

Uma solução computacional é recursiva quando é utilizada uma função que chama a si mesma, dentro de si, repetidas vezes, para compor a solução de um problema.

Page 8: Recursividade

Aplicações de Recursividade

• Algoritmos de Busca e Ordenação: Quick Sort, Merge Sort, Pesquisa Binária

• Inteligência Artificial

Page 9: Recursividade

Aplicação da Recursão

• Como aplicar a Recursão a um problema?• Fatorial– 5! = 5*4*3*2*1 = 120– n! = n*(n-1)*(n-2)*...*1– 0! e 1! = 1

!!!Vamos ao Código!!!

Page 10: Recursividade

Aplicação da Recursão#include <stdio.h>unsigned long fatorial( unsigned long num ){ if ( num <= 1 ) // teste para o caso base return 1; // casos base: 0! = 1 and 1! = 1 else // passo da recursão return num * fatorial( num - 1 );} // fim da função fatorial

Page 11: Recursividade

Solução Recursiva

• Caso Base Fatorial– if ( numero <= 1 ) return 1;

• Passo da Recursão/Operação repetida– n*(n - 1)*(n – 2)...

• Retro Propagação dos resultados – return numero * factorial( numero - 1 );

Page 12: Recursividade

Vamos a prática!#include <stdio.h>

int misterio( int, int ); // Protótipo da função int main() { int x, y; printf(“Informe dois númeroos"); scanf("%d %d", &x, &y); printf(“O resultado é %i “, misterio( x, y )) } // end main

// Parâmetro b deve ser positivo para não haver recursão infinita

int misterio( int a, int b ) {

if ( b == 1 ) return a;

else return a + misterio( a, b - 1 ); } // fim da função misterio

O que o programa faz?Qual o caso base?Qual a passo da recursão?

Page 13: Recursividade

Serie Fibonacci

• Serie encontrada na natureza, descreve a forma do espiral

• É considerada uma medida de ouro e aplicada na arquitetura, na proporção entre comprimento e largura, bem como em cartões postais. Entre outras aplicações

• Serie é composta pelos seguintes termos:– {0, 1, 1, 2, 3, 5, 8, 13, ...}

Page 14: Recursividade

Recursão int fibonacci(int n);int main(){ int L, i; //Solicitar ao usuário o número de termos printf("Digite o número de termos"); scanf("%d",&L); for (i=0; i < L; i++){ printf("%i \t", fibonacci(i)); }}

int fibonacci(int n){ if (n == 0 || n ==1) return n; return fibonacci(n-1) + fibonacci(n-2);}

Iteraçãoint main(){ int a1=0,a2=1,a3,L; //Solicitar ao usuário o número de termos printf("Digite o número de termos"); scanf("%d",&L); if(L == 1) printf(" %d ",a1); else if (L > 1) printf("%d %d ",a1,a2); while( L > 2 ){ L--; a3 = a1 + a2; a1 = a2; a2 = a3; printf(" %d ",a3); } } }

Abordagem Recursiva x Iterativa

Page 15: Recursividade

Abordagem Recursiva x Iterativa

Recursão– Estrutura de Seleção;– Usa repetição atraves de

chamdas de Função;– Teste de término: caso base

encontrado;– Produz versão mais simples

do problema a cada chamada;

– pode ocorrer infinitamente;

Iteração• Estrutura de Repetição;• Usa repetição atraves de

estrutura de controle do laço;• Fim do loop;• Modifica o contador do loop;• Pode ocorrer infinitamente;• É mais utilizada, na maioria das

vezes mais concisa e mais rápida;

Page 16: Recursividade

Revisão

• Do que é composta uma solução recursiva?unsigned long fatorial( unsigned long );int main(){ // Calculo do Fatorial de 0 até 10 for ( int cont = 0; cont <= 10; ++cont ) printf("%i! =\t %i \n", cont, fatorial(cont)); } // end main

unsigned long fatorial( unsigned long num ){ if ( num <= 1 ) // teste para o caso base return 1; else return num * fatorial( num - 1 );} // fim da função fatorial

Qual o passo da recursão?

Qual o caso base?

Page 17: Recursividade

Torre de Hanoi

• A descrição do trabalho em grupo está disponibilizado no ambiente de aprendizagem.

• A avaliação será composta com as demais avaliações.

• Será avaliada a correção da solução

Page 18: Recursividade

Próxima Aula

• Registros (Estruturas em C)– Coleções de Variáveis referenciadas por um nome– Definição;– Implementação e Uso;– Utilizando com Matrizes;

Page 19: Recursividade

Bibliografia

• GRIFFITHS, DAVID; GRIFFITHS, DAWN; Use a cabeça! C. Editora Alta Books, 2012. ISBN: 978-85-7608-794-6.

• FEOFILOFF, PAULO. Algoritmos em Linguagem C. Editora Campus/Elsevier. 2008-2009. ISBN: 978-85-352-3249-3.

• Deitel, Harvey; Paul Deitel; C - Como Programar. 6ª Edição. Editora Pearson,2011.