SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
Curso Superior de Tecnologia em Telemática
                 Programação e Estruturas de Dados

Recursividade – Fundamentos
                                      Copyright©2010
                                      Prof. César Rocha
                               cesarocha@ifpb.edu.br 1
Objetivos

§ Explorar os conceitos fundamentais acerca do uso
  de funções recursivas em estruturas de dados
   § Quando e como usar funções recursivas, fundamentos
     da recursividade, principais técnicas, exemplos
     práticos, vantagens e desvantagens, recursividade em
     estruturas de dados e boas práticas de programação.
§ Revisar alguns conceitos já formados sobre este
  assunto e estabelecer uma ligação com as funções
  relacionadas aos TAD´s de estruturas de dados
   § Apresentar alternativas interessantes para as
     construções de código que estão sendo realizadas
                                                            2
Motivação

§ Em C, vimos que os programas são organizados em
  blocos fundamentais de execução: as funções
   § É bastante comum, em nossos programas, fazermos
     com que uma função chame uma outra função para
     desempenhar alguma tarefa específica
§ Porém, em algumas situações, é útil fazer com que
  uma função seja chamada recursivamente
   § Isto é, esta função irá realizar uma chamada a si
     própria, dentro de seu corpo
   § Recursividade é um tópico um pouco mais avançado da
     construção de algoritmos
                                                           3
Importante

§ Muitos livros abordam a recursividade com base em
  algum problema pré-estabelecido e específico:
  § Séries Fibonacci, Fatorial de um número, Torres de
    Hanoi, Algoritmo da Bolha, entre muitos outros
  § Porém, quando outro problema é apresentado ao
    aluno, o mesmo fica condicionado a aplicar as mesmas
    regras do primeiro exemplo ao segundo
§ O que é importante observar:
  § Problemas recursivos tendem a apresentar (vários)
    aspectos semelhantes uns com os outros
  § O aluno pode ter um bom “faro” para identificá-los
                                                           4
Fundamentos da Recursividade

§ Para que se possa criar algoritmos recursivos sem
  grandes problemas, deve-se estar atento à:
   Œ uma chamada recursiva é feita de forma semelhante
    às chamadas de função já vistas
      § Não há nenhuma palavra chave específica da linguagem
        de programação para usar recursão, etc.
   • deve-se notar que toda função recursiva sabe apenas
    como resolver um problema (simples e atômico)
      § De modo que, se a função for chamada em cima deste
        problema pequeno, ela irá emitir um resultado imediato
      § A este elemento, dá-se o nome de “caso base” ou
        “condição de parada”                                   5
Fundamentos da Recursividade

Ž entretanto, quando uma função recursiva é chamada
 em cima de um problema mais complexo (e maior), ela
 dividirá o problema em duas partes conceituais:
   § A primeira parte é a que a função sabe como resolver de
     imediato (o caso base)
   § A segunda, tornar-se-á uma parte que ela não sabe
     como resolver de imediato. Mas a função sabe que esta
     parte ficou menor que o problema original
• geralmente, este novo problema (menor) se parece
 bastante com o original
   § Então, a função irá apenas chamar uma nova cópia de si
     mesma para trabalhar em cima deste novo problema
                                                           6
Fundamentos da Recursividade

• a esta nova cópia da função original que lidará com o
 problema, dá-se o nome de chamada recursiva
   § A chamada recursiva, então, fará com que o novo
     problema seja novamente dividido em duas partes
     conceituais e chamará uma nova cópia de si mesma
   § Assim, novos passos recursivos podem ser gerados, cada
     um com uma versão (parte dividida) cada vez menor do
     problema original
‘ este processo de divisão irá convergir até um ponto
 atômico (ou seja, o caso base)
   § Neste momento, a última chamada recursiva que
     reconhecer o caso base, irá retornar o seu resultado
     para o método anterior (em stand by) que a chamou        7
O problema do Fatorial

§ Uma vez que os aspectos a serem perseguidos em
  problemas recursivos foram vistos, é o momento de
  exercitar estes conceitos auferidos
§ Para isso, iremos começar com um problema
  matemático clássico em programação conhecido
  com o Fatorial de um número
         Fatorial: n! = n * (n-1)!
§ Onde, por definição:                   • Quem é a caso base?
                                         • Quem é a caso base?
                                         Porque?
                                         Porque?
   § Se n = 0, fatorial será igual a 1   • Como poderíamos dividir o
                                         • Como poderíamos dividir o
                                         fatorial de um número maior
                                         fatorial de um número maior
   § 3! = 3*2*1 (6)                      em fatoriais menores?
                                         em fatoriais menores?         8
Fatorial – solução iterativa

§ Note, abaixo, que podemos resolver este problema
  utilizando uma abordagem iterativa (não-recursiva)
§ O fatorial de um número maior que zero pode ser
  calculado facilmente utilizando-se um for{...}
    // Considere o código abaixo no cálculo do fatorial
       Considere o código abaixo no cálculo
    // utilizando uma abordagem iterativa
    int fatorial( int numero ){
       int contador, fatorial = 1;
       if ( numero==0 ) return fatorial;
       for( contador=numero; contador >=1; contador-- )
           fatorial *= contador;
       return fatorial;
    }
                                                             9
O problema do Fatorial

                  Pense um pouco...
§ Neste problema do fatorial, quem é o caso base (ou
  a condição de parada)?
§ E ainda, como podemos dividir o problema (fatorial
  de um número maior) em pequenos problemas
  antes de fazer uma chamada recursiva (ou seja,
  gerar fatoriais de números menores)?
   Œ podemos calcular o fatorial de qualquer número
    enquanto ele for diferente de 0. Se for igual, pare!
   • O fatorial de 3 = 3 * 2 * 1 == 3 * (2!)
                                                           10
Fatorial – solução recursiva

§ Algumas tentativas:
    // Considere o código abaixo no cálculo do fatorial
       Considere o código abaixo no cálculo
    // utilizando uma abordagem recursiva
                                  recursiva
    int fatorial( int numero ){
        if ( numero==0 ) return l; //caso base
        else
          return ( numero * fatorial( numero - 1) );
    }

    // Considere o código abaixo no cálculo do fatorial
       Considere o código abaixo no cálculo
    // utilizando uma abordagem recursiva e operador ternário
                                  recursiva
    int fatorial( int numero ){
      return (numero==0 ? 1 : fatorial( numero - 1) );
    }
                  Apenas UMA única linha de código foi feita!
                   Apenas UMA única linha de código foi feita!
                                                                 11
Recursão ou Iteração?

§ Ambas iteração e recursão utilizam estruturas de
  controle convencionais da programação
   § Iteração, normalmente, usa estruturas de repetição:
     for, while ou do/while
   § Recursão, normalmente, usa estruturas de decisão: if,
     if/else ou switch
§ Ambas iteração e recursão envolvem repetições:
   § Iteração explicitamente utiliza estruturas de repetição
   § Já a recursão alcança a repetição através de chamadas
     repetitivas (e recursivas) de si mesma (cópias)
                                                             12
Recursão ou Iteração?

§ Ambas iteração e recursão possuem uma condição
  de parada bem definida
  § A iteração termina quando a condição do loop falha
  § Recursão termina quando o caso base é encontrado
§ Ambas iteração e recursão podem ocorrer
  infinitivamente
  § O loop infinito poderá ocorrer quando o teste
    condicional nunca caminhar para falso
  § Recursão infinita pode ocorrer quando chamadas
    recursivas não dividem o problema em pedaços
    menores de modo a não convergir para o caso base
                                                         13
Recursão ou Iteração?

§ Quando a questão envolve memória
  § A iteração utiliza pouca memória para manipular seus
    contadores ou variáveis decisórias
  § Recursão causa um overhead na máquina face que
    cada chamada recursiva será alocada na pilha
§ Quando a questão envolve facilidade de código
  § Geralmente, soluções iterativas possuem mais linhas
    de código que as recursivas (são maiores)
  § Recursão, geralmente, reduz o código significavelmente
    e pode refletir com maior naturalidade o problema que
    está sendo resolvido no programa
                                                           14
Exercícios

§ Usando recursividade, escreva agora uma função
  que possa calcular o tamanho de uma lista
  simplesmente encadeada
  § O protótipo da função final pode ser dado por:
  int tamanho( TListaEnc lista );
  § Recursivamente, podemos dizer que uma lista
    encadeada é representada por:
     § Uma lista vazia ou
     § Um elemento seguido de uma (sub-)lista. Neste caso, o
       segundo elemento representa o 1º elem. da sub-lista.
  § Compare com o código já feito em aulas anteriores
                                                           15
Para um bom aproveitamento:

§ Codifique os exemplos mostrados nestes slides e
  verifique pontos de dúvidas
§ Resolva todas as questões da lista de exercícios
  de recursividade
§ Procure o professor ou monitor da disciplina e
  questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
  para a primeira avaliação.
   § Este é apenas um dos assuntos abordados na prova!

                                                         16

Mais conteúdo relacionado

Mais procurados (16)

Aula 1 lpa
Aula 1   lpaAula 1   lpa
Aula 1 lpa
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 
Algoritmos - Lógica de Programação
Algoritmos - Lógica de ProgramaçãoAlgoritmos - Lógica de Programação
Algoritmos - Lógica de Programação
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Progr
ProgrProgr
Progr
 
Curso de Shell Script 10/11
Curso de Shell Script 10/11Curso de Shell Script 10/11
Curso de Shell Script 10/11
 
Aula 13 - Trabalhando com strings
Aula 13 - Trabalhando com stringsAula 13 - Trabalhando com strings
Aula 13 - Trabalhando com strings
 
Algoritmos em portugol
Algoritmos em portugolAlgoritmos em portugol
Algoritmos em portugol
 
Algoritmos - Procedimentos
Algoritmos - ProcedimentosAlgoritmos - Procedimentos
Algoritmos - Procedimentos
 
Arrays
ArraysArrays
Arrays
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Curso de python capítulo 1 - introdução
Curso de python   capítulo 1 - introduçãoCurso de python   capítulo 1 - introdução
Curso de python capítulo 1 - introdução
 
Java3
Java3Java3
Java3
 
Curso De Algoritmo Aula 9
Curso De Algoritmo   Aula 9Curso De Algoritmo   Aula 9
Curso De Algoritmo Aula 9
 
Aula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de RepetiçãoAula 10 - Comando de Decisão Múltipla e Comandos de Repetição
Aula 10 - Comando de Decisão Múltipla e Comandos de Repetição
 
Java5
Java5Java5
Java5
 

Destaque

Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04thomasdacosta
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivasRicardo Bolanho
 
1ª lista de exercícios
1ª lista de exercícios1ª lista de exercícios
1ª lista de exercíciosdanleinad
 
LAB 02 - Programação Estruturada 2
LAB 02 - Programação Estruturada 2LAB 02 - Programação Estruturada 2
LAB 02 - Programação Estruturada 2thomasdacosta
 
Lista funcões e recursividade
Lista funcões e recursividadeLista funcões e recursividade
Lista funcões e recursividadeAnielli Lemes
 
Exercicios - Java Swing Listeners
Exercicios - Java Swing ListenersExercicios - Java Swing Listeners
Exercicios - Java Swing ListenersDaniel Arndt Alves
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 
Livro Aberto Aprendendo a Programar na Linguagem C
Livro Aberto Aprendendo a Programar na Linguagem CLivro Aberto Aprendendo a Programar na Linguagem C
Livro Aberto Aprendendo a Programar na Linguagem CMarcos Quinho
 
Introdução a estrutura de dados josé lucas rangel - raulzinho.cb@hotmail.com
Introdução a estrutura de dados   josé lucas rangel - raulzinho.cb@hotmail.comIntrodução a estrutura de dados   josé lucas rangel - raulzinho.cb@hotmail.com
Introdução a estrutura de dados josé lucas rangel - raulzinho.cb@hotmail.comRaul Batalha
 
Lista de exercícios resolvidos
Lista de exercícios resolvidosLista de exercícios resolvidos
Lista de exercícios resolvidosCrishna Irion
 
Fundamentos da programação de computadores 2ª edição
Fundamentos da programação de computadores   2ª ediçãoFundamentos da programação de computadores   2ª edição
Fundamentos da programação de computadores 2ª ediçãoLeandro Rocha de Oliveira
 
Coletanea de-exercicios-resolvidos-em-liguagem-c
Coletanea de-exercicios-resolvidos-em-liguagem-cColetanea de-exercicios-resolvidos-em-liguagem-c
Coletanea de-exercicios-resolvidos-em-liguagem-cWilson Kushima
 

Destaque (16)

Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Recursividade
RecursividadeRecursividade
Recursividade
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
1ª lista de exercícios
1ª lista de exercícios1ª lista de exercícios
1ª lista de exercícios
 
Recursividade
RecursividadeRecursividade
Recursividade
 
LAB 02 - Programação Estruturada 2
LAB 02 - Programação Estruturada 2LAB 02 - Programação Estruturada 2
LAB 02 - Programação Estruturada 2
 
Lista funcões e recursividade
Lista funcões e recursividadeLista funcões e recursividade
Lista funcões e recursividade
 
Lista Exercicios C
Lista Exercicios CLista Exercicios C
Lista Exercicios C
 
Exercicios - Java Swing Listeners
Exercicios - Java Swing ListenersExercicios - Java Swing Listeners
Exercicios - Java Swing Listeners
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Livro Aberto Aprendendo a Programar na Linguagem C
Livro Aberto Aprendendo a Programar na Linguagem CLivro Aberto Aprendendo a Programar na Linguagem C
Livro Aberto Aprendendo a Programar na Linguagem C
 
Introdução a estrutura de dados josé lucas rangel - raulzinho.cb@hotmail.com
Introdução a estrutura de dados   josé lucas rangel - raulzinho.cb@hotmail.comIntrodução a estrutura de dados   josé lucas rangel - raulzinho.cb@hotmail.com
Introdução a estrutura de dados josé lucas rangel - raulzinho.cb@hotmail.com
 
Lista de exercícios resolvidos
Lista de exercícios resolvidosLista de exercícios resolvidos
Lista de exercícios resolvidos
 
Fundamentos da programação de computadores 2ª edição
Fundamentos da programação de computadores   2ª ediçãoFundamentos da programação de computadores   2ª edição
Fundamentos da programação de computadores 2ª edição
 
Coletanea de-exercicios-resolvidos-em-liguagem-c
Coletanea de-exercicios-resolvidos-em-liguagem-cColetanea de-exercicios-resolvidos-em-liguagem-c
Coletanea de-exercicios-resolvidos-em-liguagem-c
 

Semelhante a Fatorial Recursivo

Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem CLeonardo Lima
 
Tutorial aed iii 007 - algoritmo de ordenação heapsort
Tutorial aed iii   007 - algoritmo de ordenação heapsortTutorial aed iii   007 - algoritmo de ordenação heapsort
Tutorial aed iii 007 - algoritmo de ordenação heapsortFlávio Freitas
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Apostila logica algoritmos e estrutuara de dados
Apostila  logica algoritmos e estrutuara de dadosApostila  logica algoritmos e estrutuara de dados
Apostila logica algoritmos e estrutuara de dadosGelber Freitas
 
Java memory model primary ref. - faq
Java memory model   primary ref. - faqJava memory model   primary ref. - faq
Java memory model primary ref. - faqPedro De Almeida
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Aula de Matemática para o 1º do ensino medio
Aula de Matemática para o 1º do ensino medioAula de Matemática para o 1º do ensino medio
Aula de Matemática para o 1º do ensino medioAna Paula Azevedo
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsortFlávio Freitas
 

Semelhante a Fatorial Recursivo (20)

Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
AP5_2013_2.pptx
AP5_2013_2.pptxAP5_2013_2.pptx
AP5_2013_2.pptx
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Tutorial aed iii 007 - algoritmo de ordenação heapsort
Tutorial aed iii   007 - algoritmo de ordenação heapsortTutorial aed iii   007 - algoritmo de ordenação heapsort
Tutorial aed iii 007 - algoritmo de ordenação heapsort
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Algoritmo recursivo
Algoritmo recursivoAlgoritmo recursivo
Algoritmo recursivo
 
Apostila logica algoritmos e estrutuara de dados
Apostila  logica algoritmos e estrutuara de dadosApostila  logica algoritmos e estrutuara de dados
Apostila logica algoritmos e estrutuara de dados
 
Java memory model primary ref. - faq
Java memory model   primary ref. - faqJava memory model   primary ref. - faq
Java memory model primary ref. - faq
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Funções em C
Funções em CFunções em C
Funções em C
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Visualg
VisualgVisualg
Visualg
 
Aula de Matemática para o 1º do ensino medio
Aula de Matemática para o 1º do ensino medioAula de Matemática para o 1º do ensino medio
Aula de Matemática para o 1º do ensino medio
 
Semanaupecaruaru2013 c++para iniciantes
Semanaupecaruaru2013 c++para iniciantesSemanaupecaruaru2013 c++para iniciantes
Semanaupecaruaru2013 c++para iniciantes
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsort
 
Algoritmos - Aula 07 A - Lacos
Algoritmos - Aula 07 A - LacosAlgoritmos - Aula 07 A - Lacos
Algoritmos - Aula 07 A - Lacos
 
Oz
OzOz
Oz
 
Noções de Recursao
Noções de RecursaoNoções de Recursao
Noções de Recursao
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 

Mais de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Mais de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 07
Java 07Java 07
Java 07
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 

Fatorial Recursivo

  • 1. Curso Superior de Tecnologia em Telemática Programação e Estruturas de Dados Recursividade – Fundamentos Copyright©2010 Prof. César Rocha cesarocha@ifpb.edu.br 1
  • 2. Objetivos § Explorar os conceitos fundamentais acerca do uso de funções recursivas em estruturas de dados § Quando e como usar funções recursivas, fundamentos da recursividade, principais técnicas, exemplos práticos, vantagens e desvantagens, recursividade em estruturas de dados e boas práticas de programação. § Revisar alguns conceitos já formados sobre este assunto e estabelecer uma ligação com as funções relacionadas aos TAD´s de estruturas de dados § Apresentar alternativas interessantes para as construções de código que estão sendo realizadas 2
  • 3. Motivação § Em C, vimos que os programas são organizados em blocos fundamentais de execução: as funções § É bastante comum, em nossos programas, fazermos com que uma função chame uma outra função para desempenhar alguma tarefa específica § Porém, em algumas situações, é útil fazer com que uma função seja chamada recursivamente § Isto é, esta função irá realizar uma chamada a si própria, dentro de seu corpo § Recursividade é um tópico um pouco mais avançado da construção de algoritmos 3
  • 4. Importante § Muitos livros abordam a recursividade com base em algum problema pré-estabelecido e específico: § Séries Fibonacci, Fatorial de um número, Torres de Hanoi, Algoritmo da Bolha, entre muitos outros § Porém, quando outro problema é apresentado ao aluno, o mesmo fica condicionado a aplicar as mesmas regras do primeiro exemplo ao segundo § O que é importante observar: § Problemas recursivos tendem a apresentar (vários) aspectos semelhantes uns com os outros § O aluno pode ter um bom “faro” para identificá-los 4
  • 5. Fundamentos da Recursividade § Para que se possa criar algoritmos recursivos sem grandes problemas, deve-se estar atento à: Œ uma chamada recursiva é feita de forma semelhante às chamadas de função já vistas § Não há nenhuma palavra chave específica da linguagem de programação para usar recursão, etc. • deve-se notar que toda função recursiva sabe apenas como resolver um problema (simples e atômico) § De modo que, se a função for chamada em cima deste problema pequeno, ela irá emitir um resultado imediato § A este elemento, dá-se o nome de “caso base” ou “condição de parada” 5
  • 6. Fundamentos da Recursividade Ž entretanto, quando uma função recursiva é chamada em cima de um problema mais complexo (e maior), ela dividirá o problema em duas partes conceituais: § A primeira parte é a que a função sabe como resolver de imediato (o caso base) § A segunda, tornar-se-á uma parte que ela não sabe como resolver de imediato. Mas a função sabe que esta parte ficou menor que o problema original • geralmente, este novo problema (menor) se parece bastante com o original § Então, a função irá apenas chamar uma nova cópia de si mesma para trabalhar em cima deste novo problema 6
  • 7. Fundamentos da Recursividade • a esta nova cópia da função original que lidará com o problema, dá-se o nome de chamada recursiva § A chamada recursiva, então, fará com que o novo problema seja novamente dividido em duas partes conceituais e chamará uma nova cópia de si mesma § Assim, novos passos recursivos podem ser gerados, cada um com uma versão (parte dividida) cada vez menor do problema original ‘ este processo de divisão irá convergir até um ponto atômico (ou seja, o caso base) § Neste momento, a última chamada recursiva que reconhecer o caso base, irá retornar o seu resultado para o método anterior (em stand by) que a chamou 7
  • 8. O problema do Fatorial § Uma vez que os aspectos a serem perseguidos em problemas recursivos foram vistos, é o momento de exercitar estes conceitos auferidos § Para isso, iremos começar com um problema matemático clássico em programação conhecido com o Fatorial de um número Fatorial: n! = n * (n-1)! § Onde, por definição: • Quem é a caso base? • Quem é a caso base? Porque? Porque? § Se n = 0, fatorial será igual a 1 • Como poderíamos dividir o • Como poderíamos dividir o fatorial de um número maior fatorial de um número maior § 3! = 3*2*1 (6) em fatoriais menores? em fatoriais menores? 8
  • 9. Fatorial – solução iterativa § Note, abaixo, que podemos resolver este problema utilizando uma abordagem iterativa (não-recursiva) § O fatorial de um número maior que zero pode ser calculado facilmente utilizando-se um for{...} // Considere o código abaixo no cálculo do fatorial Considere o código abaixo no cálculo // utilizando uma abordagem iterativa int fatorial( int numero ){ int contador, fatorial = 1; if ( numero==0 ) return fatorial; for( contador=numero; contador >=1; contador-- ) fatorial *= contador; return fatorial; } 9
  • 10. O problema do Fatorial Pense um pouco... § Neste problema do fatorial, quem é o caso base (ou a condição de parada)? § E ainda, como podemos dividir o problema (fatorial de um número maior) em pequenos problemas antes de fazer uma chamada recursiva (ou seja, gerar fatoriais de números menores)? Œ podemos calcular o fatorial de qualquer número enquanto ele for diferente de 0. Se for igual, pare! • O fatorial de 3 = 3 * 2 * 1 == 3 * (2!) 10
  • 11. Fatorial – solução recursiva § Algumas tentativas: // Considere o código abaixo no cálculo do fatorial Considere o código abaixo no cálculo // utilizando uma abordagem recursiva recursiva int fatorial( int numero ){ if ( numero==0 ) return l; //caso base else return ( numero * fatorial( numero - 1) ); } // Considere o código abaixo no cálculo do fatorial Considere o código abaixo no cálculo // utilizando uma abordagem recursiva e operador ternário recursiva int fatorial( int numero ){ return (numero==0 ? 1 : fatorial( numero - 1) ); } Apenas UMA única linha de código foi feita! Apenas UMA única linha de código foi feita! 11
  • 12. Recursão ou Iteração? § Ambas iteração e recursão utilizam estruturas de controle convencionais da programação § Iteração, normalmente, usa estruturas de repetição: for, while ou do/while § Recursão, normalmente, usa estruturas de decisão: if, if/else ou switch § Ambas iteração e recursão envolvem repetições: § Iteração explicitamente utiliza estruturas de repetição § Já a recursão alcança a repetição através de chamadas repetitivas (e recursivas) de si mesma (cópias) 12
  • 13. Recursão ou Iteração? § Ambas iteração e recursão possuem uma condição de parada bem definida § A iteração termina quando a condição do loop falha § Recursão termina quando o caso base é encontrado § Ambas iteração e recursão podem ocorrer infinitivamente § O loop infinito poderá ocorrer quando o teste condicional nunca caminhar para falso § Recursão infinita pode ocorrer quando chamadas recursivas não dividem o problema em pedaços menores de modo a não convergir para o caso base 13
  • 14. Recursão ou Iteração? § Quando a questão envolve memória § A iteração utiliza pouca memória para manipular seus contadores ou variáveis decisórias § Recursão causa um overhead na máquina face que cada chamada recursiva será alocada na pilha § Quando a questão envolve facilidade de código § Geralmente, soluções iterativas possuem mais linhas de código que as recursivas (são maiores) § Recursão, geralmente, reduz o código significavelmente e pode refletir com maior naturalidade o problema que está sendo resolvido no programa 14
  • 15. Exercícios § Usando recursividade, escreva agora uma função que possa calcular o tamanho de uma lista simplesmente encadeada § O protótipo da função final pode ser dado por: int tamanho( TListaEnc lista ); § Recursivamente, podemos dizer que uma lista encadeada é representada por: § Uma lista vazia ou § Um elemento seguido de uma (sub-)lista. Neste caso, o segundo elemento representa o 1º elem. da sub-lista. § Compare com o código já feito em aulas anteriores 15
  • 16. Para um bom aproveitamento: § Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas § Resolva todas as questões da lista de exercícios de recursividade § Procure o professor ou monitor da disciplina e questione conceitos, listas, etc. § Não deixe para codificar tudo e acumular assunto para a primeira avaliação. § Este é apenas um dos assuntos abordados na prova! 16