SlideShare uma empresa Scribd logo
1 de 55
Profa. Divani Barbosa Gavinier
Aula 3 – parte 2 – Estrutura de Dados
 Uma função ou método é chamado recursivo
quando dentro dele existe uma chamada para
ele próprio.
Exemplo:
Chamada Recursiva
Se a natureza dos subproblemas é a mesma do
problema, o mesmo método usado para reduzir
o problema pode ser usado para reduzir os
subproblemas e assim por diante.
 A recursividade é uma forma interessante de
resolver problemas por meio da divisão dos
problemas em problemas menores de mesma
natureza.
 Quando devemos parar?
Quando alcançarmos um caso trivial que
conhecemos a solução.
Caso fácil de resolver,
onde a solução é
simples
 Qual o fatorial de zero?
 Quanto é um dado x multiplicado por 1?
 Quanto é um dado x multiplicado por 0?
 Quanto é x elevado a 1?
 Quantos elementos possui um vetor vazio?
Exemplos de casos triviais:
 Muitas funções podem ser definidas
recursivamente, para isso é necessário
identificar as duas partes acima.
 Qualquer problema resolvido de forma
iterativa também pode ser resolvido de forma
recursiva.
 Assim um processo recursivo para resolução
de um problema consiste em duas partes:
1. O caso trivial, cuja solução é conhecida;
2. Um método geral que reduz o problema a um ou
mais problemas menores (subproblemas) de
mesma natureza.
Exemplo função fatorial:
A função fatorial de um inteiro não negativo
pode ser definida como:
𝑛! =
1 𝑛 = 0
𝑛 ∗ 𝑛 − 1 ! 𝑛 > 0
Essa definição estabelece um processo recursivo
para calcular o fatorial de um inteiro n.
 Caso trivial: n=0. Neste caso n! = 1.
 Método geral: 𝑛 ∗ 𝑛 − 1 !.
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! =
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
Caso Trivial, fácil de
resolver, onde a
solução é simples
0! = 1
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
= 4 * (3 * (2 * (1 * 1)))
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
= 4 * (3 * (2 * (1 * 1)))
= 4 * (3 * (2 * 1))
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
= 4 * (3 * (2 * (1 * 1)))
= 4 * (3 * (2 * 1))
= 4 * (3 * 2)
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
= 4 * (3 * (2 * (1 * 1)))
= 4 * (3 * (2 * 1))
= 4 * (3 * 2)
= 4 * 6
Assim, usando-se este processo recursivo, o
calculo de 4!, por exemplo, é feito como a
seguir:
4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
= 4 * (3 * (2 * (1 * 1)))
= 4 * (3 * (2 * 1))
= 4 * (3 * 2)
= 4 * 6
= 24
int fat(int n)
{
if (n == 0)
return 1;
else
return n*fat(n-1);
}
Mas como uma função
recursiva é de fato
implementada no computador?
Usando-se um mecanismo
chamado de PILHA DE EXECUÇÃO!
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4)
fatorial(3)
fatorial(2)
fatorial(1)
fatorial(0)
→ return 4 * fatorial(3)
→ return 3 * fatorial(2)
→ return 2 * fatorial(1)
→ return 1 * fatorial(0)
→ return 1 (caso trivial)
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4)
fatorial(3)
fatorial(2)
fatorial(1)
fatorial(0)
→ return 4 * fatorial(3)
→ return 3 * fatorial(2)
→ return 2 * fatorial(1)
→ return 1 * fatorial(0)
→ return 1 (caso trivial)
Desempilha fatorial(0)
retorna 1
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4)
fatorial(3)
fatorial(2)
fatorial(1)
→ return 4 * fatorial(3)
→ return 3 * fatorial(2)
→ return 2 * fatorial(1)
→ return 1 * 1
Desempilha fatorial(1)
retorna 1*1
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4)
fatorial(3)
fatorial(2)
→ return 4 * fatorial(3)
→ return 3 * fatorial(2)
→ return 2 * 1 * 1
Desempilha fatorial(2)
retorna 2 * 1 * 1
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4)
fatorial(3)
→ return 4 * fatorial(3)
→ return 3 * 2 * 1 * 1
Desempilha fatorial(3)
retorna 3 * 2 * 1 * 1
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Pilha de execução:
fatorial(4) → return 4 * 3 * 2 * 1 * 1
Desempilha fatorial(4)
retorna 4 * 3 * 2 * 1 * 1
Considere, novamente, o exemplo para 4! :
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n - 1);
}
Resultado é (4 * 3 * 2 * 1 * 1)
Resultado = 24
Função em Java
Programa
principal
Código em Java:
 “Para fazer um processo recursivo é preciso ter
fé”. prof. Siang Wun Song
 “Ao tentar resolver o problema, encontrei
obstáculos dentro de obstáculos. Por isso adotei
uma solução recursiva!”.
 “To undestand recursion, we must first
understand recursion.”
Presente em praticamente todas as linguagens,
como: C, C++, Java, Pascal, JavaScript, Python...
Muitos algoritmos complexos são resolvidos
através de soluções recursivas
 QuickSort
 MergeSort
 Busca Binária
Muitas estruturas de dados são recursivas:
 Arvores Binárias
 Listas encadeadas
Tendem a gerar códigos menores que as iterativas
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
}
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
if (a == 0)
return
}
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
if (a == 0)
return 0;
}
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return
}
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return b;
}
Codifique uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas.
Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12
int mult(int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return b;
return b + mult(a-1,b);
}
Método geral:
Como a soma
sucessiva será
aplicada a b então
teremos
b+mult(a-1,b).
O a-1 é porque
uma soma já foi
realizada.
mult(3,5) = if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5) if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) =
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
= 3 + 3 + mult(2,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
= 3 + 3 + mult(2,3)
= 3 + 3 + 3 + mult(2-1,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
= 3 + 3 + mult(2,3)
= 3 + 3 + 3 + mult(2-1,3)
= 3 + 3 + 3 + mult(1,3)
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
= 3 + 3 + mult(2,3)
= 3 + 3 + 3 + mult(2-1,3)
= 3 + 3 + 3 + mult(1,3)
= 3 + 3 + 3 + 3
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
mult(3,5) = 5 + mult(3-1,5)
= 5 + mult(2,5)
= 5 + 5 + mult(2-1,5)
= 5 + 5 + mult(1,5)
= 5 + 5 + 5
= 15
mult(4,3) = 3 + mult(4-1,3)
= 3 + mult(3,3)
= 3 + 3 + mult(3-1,3)
= 3 + 3 + mult(2,3)
= 3 + 3 + 3 + mult(2-1,3)
= 3 + 3 + 3 + mult(1,3)
= 3 + 3 + 3 + 3
= 12
if (a == 0)
return 0;
if (a == 1)
return b;
return b+mult(a-1,b);
Trecho código
1. Implemente o código em Java da função que
multiplica um dado inteiro “a” por um inteiro “b”,
usando somas sucessivas.
2. Sequencia de Fibonacci
É uma sequência de números inteiros, começando
normalmente por 0 e 1, na qual, cada termo
subsequente corresponde a soma dos dois anteriores.
Exemplo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Caso trivial: n=0 ou n=1. Neste caso retorne n.
Método geral: retorne fib(n-2)+fib(n-1)
3. Responda o que é uma função recursiva?
4. Escreva um programa em Java que atribua valores
aleatórios a um vetor de 20 elementos inteiros.
Ordene o vetor e imprima seu conteúdo na tela.
Leia do usuário um valor e realize a busca recursiva do
mesmo dentro do vetor de acordo com o algoritmo
abaixo.
import java.util.*;
public class NumAleat {
public static void main(String[] args) {
Random gerador = new Random();
// imprime sequência de 10 números inteiros aleatórios
// entre 0 e 20
for (int i = 0; i < 10; i++)
System.out.println(gerador.nextInt(21));
}
}
Números aleatórios em Java

Mais conteúdo relacionado

Mais procurados

Mat exercicios resolvidos 009
Mat exercicios resolvidos  009Mat exercicios resolvidos  009
Mat exercicios resolvidos 009trigono_metrico
 
Intro teoria dos numerros cap3
Intro teoria dos numerros cap3Intro teoria dos numerros cap3
Intro teoria dos numerros cap3Paulo Martins
 
Modelagem matematica aplicada a engenharia quimica
Modelagem matematica aplicada a engenharia quimicaModelagem matematica aplicada a engenharia quimica
Modelagem matematica aplicada a engenharia quimicaVinicius Chacon
 
Análise de Algoritmos - Método Guloso
Análise de Algoritmos - Método GulosoAnálise de Algoritmos - Método Guloso
Análise de Algoritmos - Método GulosoDelacyr Ferreira
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaGabriel Albuquerque
 
Trabalho de Cálculo Numérico
Trabalho  de Cálculo NuméricoTrabalho  de Cálculo Numérico
Trabalho de Cálculo NuméricoItaylane Malta
 
18 algoritmos de busca de palavras em texto
18   algoritmos de busca de palavras em texto18   algoritmos de busca de palavras em texto
18 algoritmos de busca de palavras em textoRicardo Bolanho
 

Mais procurados (8)

Mat exercicios resolvidos 009
Mat exercicios resolvidos  009Mat exercicios resolvidos  009
Mat exercicios resolvidos 009
 
Intro teoria dos numerros cap3
Intro teoria dos numerros cap3Intro teoria dos numerros cap3
Intro teoria dos numerros cap3
 
Modelagem matematica aplicada a engenharia quimica
Modelagem matematica aplicada a engenharia quimicaModelagem matematica aplicada a engenharia quimica
Modelagem matematica aplicada a engenharia quimica
 
Análise de Algoritmos - Método Guloso
Análise de Algoritmos - Método GulosoAnálise de Algoritmos - Método Guloso
Análise de Algoritmos - Método Guloso
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma Máxima
 
Trabalho de Cálculo Numérico
Trabalho  de Cálculo NuméricoTrabalho  de Cálculo Numérico
Trabalho de Cálculo Numérico
 
18 algoritmos de busca de palavras em texto
18   algoritmos de busca de palavras em texto18   algoritmos de busca de palavras em texto
18 algoritmos de busca de palavras em texto
 
If672cc p1 sol
If672cc p1 solIf672cc p1 sol
If672cc p1 sol
 

Semelhante a RecursividadeFunções

aula de cálculo pdf atualizado 2023 funções
aula de cálculo pdf atualizado 2023 funçõesaula de cálculo pdf atualizado 2023 funções
aula de cálculo pdf atualizado 2023 funçõesgauchinshitpost
 
Calculo Integral - Conceito de primitiva e técnicas de primitivação
Calculo Integral - Conceito de primitiva e técnicas de primitivaçãoCalculo Integral - Conceito de primitiva e técnicas de primitivação
Calculo Integral - Conceito de primitiva e técnicas de primitivaçãoMaths Tutoring
 
Programação Funcional com Javascript
Programação Funcional com JavascriptProgramação Funcional com Javascript
Programação Funcional com JavascriptAlexandre Gomes
 
Aula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxppppppAula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxppppppalessandraoliveira324
 
Fórmula Luderiana para Equação Quíntica
Fórmula Luderiana para Equação QuínticaFórmula Luderiana para Equação Quíntica
Fórmula Luderiana para Equação Quínticaludenir
 
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_javaMirlem Pereira
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em Crodolfoeyalana
 
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...Samer Atef Serhan
 
Teoria elementar dos numeros
Teoria elementar dos numerosTeoria elementar dos numeros
Teoria elementar dos numeroslealtran
 
Equações e enequações modulares.
Equações e  enequações modulares.Equações e  enequações modulares.
Equações e enequações modulares.Noely Menezes
 
Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando CVinícius Hax
 
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdf
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdfPC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdf
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdfssuserce7c52
 

Semelhante a RecursividadeFunções (20)

aula de cálculo pdf atualizado 2023 funções
aula de cálculo pdf atualizado 2023 funçõesaula de cálculo pdf atualizado 2023 funções
aula de cálculo pdf atualizado 2023 funções
 
Calculo Integral - Conceito de primitiva e técnicas de primitivação
Calculo Integral - Conceito de primitiva e técnicas de primitivaçãoCalculo Integral - Conceito de primitiva e técnicas de primitivação
Calculo Integral - Conceito de primitiva e técnicas de primitivação
 
Programação Funcional com Javascript
Programação Funcional com JavascriptProgramação Funcional com Javascript
Programação Funcional com Javascript
 
Aula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxppppppAula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxpppppp
 
Gabarito av2 ma14_2016
Gabarito av2 ma14_2016Gabarito av2 ma14_2016
Gabarito av2 ma14_2016
 
05042014
0504201405042014
05042014
 
Fórmula Luderiana para Equação Quíntica
Fórmula Luderiana para Equação QuínticaFórmula Luderiana para Equação Quíntica
Fórmula Luderiana para Equação Quíntica
 
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
 
Binômio de newton
Binômio de newtonBinômio de newton
Binômio de newton
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em C
 
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...
ABORDAGENS ALGEBRICAS SOBRE A IMPORTANCIA DOS NUMEROS IMAGINÁRIOS E O CONJUN...
 
17052014
1705201417052014
17052014
 
Teoria elementar dos numeros
Teoria elementar dos numerosTeoria elementar dos numeros
Teoria elementar dos numeros
 
01032014
0103201401032014
01032014
 
Binomio de newton
Binomio de newtonBinomio de newton
Binomio de newton
 
22032014
2203201422032014
22032014
 
01032014
0103201401032014
01032014
 
Equações e enequações modulares.
Equações e  enequações modulares.Equações e  enequações modulares.
Equações e enequações modulares.
 
Conhecendo ou relembrando C
Conhecendo ou relembrando CConhecendo ou relembrando C
Conhecendo ou relembrando C
 
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdf
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdfPC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdf
PC_2020-2_EP07_Paridade. Inversa. Crescimento_GABARITO.pdf
 

Mais de Divani Barbosa (20)

Banco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface GraficaBanco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface Grafica
 
Aula 22
Aula 22Aula 22
Aula 22
 
Aula 21
Aula 21Aula 21
Aula 21
 
Aula 20
Aula 20Aula 20
Aula 20
 
Aula 19
Aula 19Aula 19
Aula 19
 
Aula 18
Aula 18Aula 18
Aula 18
 
Aula 17
Aula 17Aula 17
Aula 17
 
Aula 16
Aula 16Aula 16
Aula 16
 
Aula 15
Aula 15Aula 15
Aula 15
 
Aula14
Aula14Aula14
Aula14
 
Aula 13
Aula 13Aula 13
Aula 13
 
Aula 12
Aula 12Aula 12
Aula 12
 
Aula 11
Aula 11Aula 11
Aula 11
 
Aula 10
Aula 10 Aula 10
Aula 10
 
Aula 9
Aula 9Aula 9
Aula 9
 
Aula 8
Aula 8Aula 8
Aula 8
 
Aula 7
Aula 7 Aula 7
Aula 7
 
Aula 6
Aula 6Aula 6
Aula 6
 
Aula 5
Aula 5 Aula 5
Aula 5
 
Aula 4
Aula 4 Aula 4
Aula 4
 

RecursividadeFunções

  • 1. Profa. Divani Barbosa Gavinier Aula 3 – parte 2 – Estrutura de Dados
  • 2.  Uma função ou método é chamado recursivo quando dentro dele existe uma chamada para ele próprio. Exemplo: Chamada Recursiva
  • 3. Se a natureza dos subproblemas é a mesma do problema, o mesmo método usado para reduzir o problema pode ser usado para reduzir os subproblemas e assim por diante.  A recursividade é uma forma interessante de resolver problemas por meio da divisão dos problemas em problemas menores de mesma natureza.  Quando devemos parar? Quando alcançarmos um caso trivial que conhecemos a solução. Caso fácil de resolver, onde a solução é simples
  • 4.  Qual o fatorial de zero?  Quanto é um dado x multiplicado por 1?  Quanto é um dado x multiplicado por 0?  Quanto é x elevado a 1?  Quantos elementos possui um vetor vazio? Exemplos de casos triviais:
  • 5.  Muitas funções podem ser definidas recursivamente, para isso é necessário identificar as duas partes acima.  Qualquer problema resolvido de forma iterativa também pode ser resolvido de forma recursiva.  Assim um processo recursivo para resolução de um problema consiste em duas partes: 1. O caso trivial, cuja solução é conhecida; 2. Um método geral que reduz o problema a um ou mais problemas menores (subproblemas) de mesma natureza.
  • 6. Exemplo função fatorial: A função fatorial de um inteiro não negativo pode ser definida como: 𝑛! = 1 𝑛 = 0 𝑛 ∗ 𝑛 − 1 ! 𝑛 > 0 Essa definição estabelece um processo recursivo para calcular o fatorial de um inteiro n.  Caso trivial: n=0. Neste caso n! = 1.  Método geral: 𝑛 ∗ 𝑛 − 1 !.
  • 7. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! =
  • 8. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3!
  • 9. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!)
  • 10. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!))
  • 11. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) Caso Trivial, fácil de resolver, onde a solução é simples 0! = 1
  • 12. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1)))
  • 13. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1))
  • 14. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2)
  • 15. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6
  • 16. Assim, usando-se este processo recursivo, o calculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!))) = 4 * (3 * (2 * (1 * 1))) = 4 * (3 * (2 * 1)) = 4 * (3 * 2) = 4 * 6 = 24 int fat(int n) { if (n == 0) return 1; else return n*fat(n-1); } Mas como uma função recursiva é de fato implementada no computador? Usando-se um mecanismo chamado de PILHA DE EXECUÇÃO!
  • 17. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) fatorial(3) fatorial(2) fatorial(1) fatorial(0) → return 4 * fatorial(3) → return 3 * fatorial(2) → return 2 * fatorial(1) → return 1 * fatorial(0) → return 1 (caso trivial)
  • 18. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) fatorial(3) fatorial(2) fatorial(1) fatorial(0) → return 4 * fatorial(3) → return 3 * fatorial(2) → return 2 * fatorial(1) → return 1 * fatorial(0) → return 1 (caso trivial) Desempilha fatorial(0) retorna 1
  • 19. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) fatorial(3) fatorial(2) fatorial(1) → return 4 * fatorial(3) → return 3 * fatorial(2) → return 2 * fatorial(1) → return 1 * 1 Desempilha fatorial(1) retorna 1*1
  • 20. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) fatorial(3) fatorial(2) → return 4 * fatorial(3) → return 3 * fatorial(2) → return 2 * 1 * 1 Desempilha fatorial(2) retorna 2 * 1 * 1
  • 21. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) fatorial(3) → return 4 * fatorial(3) → return 3 * 2 * 1 * 1 Desempilha fatorial(3) retorna 3 * 2 * 1 * 1
  • 22. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Pilha de execução: fatorial(4) → return 4 * 3 * 2 * 1 * 1 Desempilha fatorial(4) retorna 4 * 3 * 2 * 1 * 1
  • 23. Considere, novamente, o exemplo para 4! : int fatorial(int n) { if (n == 0) return 1; else return n * fatorial(n - 1); } Resultado é (4 * 3 * 2 * 1 * 1) Resultado = 24
  • 25.  “Para fazer um processo recursivo é preciso ter fé”. prof. Siang Wun Song  “Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos. Por isso adotei uma solução recursiva!”.  “To undestand recursion, we must first understand recursion.”
  • 26.
  • 27.
  • 28.
  • 29.
  • 30. Presente em praticamente todas as linguagens, como: C, C++, Java, Pascal, JavaScript, Python... Muitos algoritmos complexos são resolvidos através de soluções recursivas  QuickSort  MergeSort  Busca Binária Muitas estruturas de dados são recursivas:  Arvores Binárias  Listas encadeadas Tendem a gerar códigos menores que as iterativas
  • 31. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { }
  • 32. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { if (a == 0) return }
  • 33. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { if (a == 0) return 0; }
  • 34. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { if (a == 0) return 0; if (a == 1) return }
  • 35. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { if (a == 0) return 0; if (a == 1) return b; }
  • 36. Codifique uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: 4 * 3 = 3 + 3 + 3 + 3 = 12 int mult(int a, int b) { if (a == 0) return 0; if (a == 1) return b; return b + mult(a-1,b); } Método geral: Como a soma sucessiva será aplicada a b então teremos b+mult(a-1,b). O a-1 é porque uma soma já foi realizada.
  • 37. mult(3,5) = if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 38. mult(3,5) = 5 + mult(3-1,5) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 39. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 40. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 41. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 42. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 43. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 44. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 45. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 46. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 47. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 48. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) = 3 + 3 + mult(2,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 49. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) = 3 + 3 + mult(2,3) = 3 + 3 + 3 + mult(2-1,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 50. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) = 3 + 3 + mult(2,3) = 3 + 3 + 3 + mult(2-1,3) = 3 + 3 + 3 + mult(1,3) if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 51. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) = 3 + 3 + mult(2,3) = 3 + 3 + 3 + mult(2-1,3) = 3 + 3 + 3 + mult(1,3) = 3 + 3 + 3 + 3 if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 52. mult(3,5) = 5 + mult(3-1,5) = 5 + mult(2,5) = 5 + 5 + mult(2-1,5) = 5 + 5 + mult(1,5) = 5 + 5 + 5 = 15 mult(4,3) = 3 + mult(4-1,3) = 3 + mult(3,3) = 3 + 3 + mult(3-1,3) = 3 + 3 + mult(2,3) = 3 + 3 + 3 + mult(2-1,3) = 3 + 3 + 3 + mult(1,3) = 3 + 3 + 3 + 3 = 12 if (a == 0) return 0; if (a == 1) return b; return b+mult(a-1,b); Trecho código
  • 53. 1. Implemente o código em Java da função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. 2. Sequencia de Fibonacci É uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente corresponde a soma dos dois anteriores. Exemplo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Caso trivial: n=0 ou n=1. Neste caso retorne n. Método geral: retorne fib(n-2)+fib(n-1) 3. Responda o que é uma função recursiva?
  • 54. 4. Escreva um programa em Java que atribua valores aleatórios a um vetor de 20 elementos inteiros. Ordene o vetor e imprima seu conteúdo na tela. Leia do usuário um valor e realize a busca recursiva do mesmo dentro do vetor de acordo com o algoritmo abaixo.
  • 55. import java.util.*; public class NumAleat { public static void main(String[] args) { Random gerador = new Random(); // imprime sequência de 10 números inteiros aleatórios // entre 0 e 20 for (int i = 0; i < 10; i++) System.out.println(gerador.nextInt(21)); } } Números aleatórios em Java