O documento discute recursividade, definindo-a como uma solução computacional que utiliza uma função que chama a si mesma repetidamente. Apresenta exemplos como fatorial e Fibonacci e compara abordagens recursivas versus iterativas. Por fim, desafia os alunos a resolverem o problema da Torre de Hanói recursivamente.
2. 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)!!!
3. 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.
4. Revisão de Funções
• Como definir uma função?
– tipo_retorno nome_funcao(tipo parametro, tipo param){ Corpo função };
5. 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.
7. 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.
8. Aplicações de Recursividade
• Algoritmos de Busca e Ordenação: Quick Sort,
Merge Sort, Pesquisa Binária
• Inteligência Artificial
9. 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!!!
10. 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
11. 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 );
12. 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?
13. 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, ...}
14. 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ção
int 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
15. 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;
16. 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?
17. 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
18. 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;
19. 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.