SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
Recursividade
Prof. Sérgio Souza Costa
Recursividade
• Muitas estruturas de dados como listas e árvores são
recursivas, então é importante compreender
conceito de recursividade.

*
Recursividade
▪

A recursividade é uma forma de resolver problemas por meio da divisão
dos problemas em problemas menores de mesma natureza.

▪

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.

▪

Quando devemos parar? Quando alcançarmos um caso trivial que
conhecemos a solução.

*
Recursividade
• Exemplos de casos triviais:
–
–
–
–
–

Qual o fatorial de 0 ?
Quanto é um dado X multiplicado por 1 ?
Quanto é um dado X multiplicado por 0 ?
Quanto é um dado X elevado a 1 ?
Quantos elementos tem em uma lista vazia?
Recursividade
Assim, um processo recursivo para a solução de um
problema consiste em duas partes:

▪
▪
▪

▪

▪

O caso trivial, cuja solução é conhecida;
Um método geral que reduz o problema a um ou mais
problemas menores (subproblemas) de mesma
natureza.

Muitas funções podem ser definidas
recursivamente. Para isso, é preciso identificar as
duas partes acima.
Exemplo: fatorial de um número e o n-ésimo termo
da seqüência de Fibonacci.
*
Função fatorial
▪

A função fatorial de um inteiro não negativo pode
ser definida como:

▪

Esta definição estabelece um processo recursivo
para calcular o fatorial de um inteiro n.
Caso trivial: n=0.
Método geral: n x (n-1)!.

▪
▪

*
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
de 4!, por exemplo, é feito como a seguir:

4! =

*
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3!

*
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3!
= 4 * (3 * 2!)
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
de 4!, por exemplo, é feito como a seguir:

4! = 4 * 3!
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * (1 * 0!)))
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
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)))
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
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))
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
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)
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
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
Função fatorial
▪

Assim, usando-se este processo recursivo, o cálculo
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

Mas como uma função recursiva
é de fato implementada no
computador?
Usando-se o mecanismo conhecido como
Pilha de Execução!
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução

fatorial(2)

-> return 2*fatorial(1)

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução

fatorial(1)

-> return 1*fatorial(0)

fatorial(2)

-> return 2*fatorial(1)

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução

fatorial(0)
fatorial(1)

-> return 1 (caso trivial)
-> return 1*fatorial(0)

fatorial(2)

-> return 2*fatorial(1)

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Pilha de Execução
Desempilha fatorial(0)
fatorial(0)
fatorial(1)

-> return 1 (caso trivial)
-> return 1*fatorial(0)

fatorial(2)

-> return 2*fatorial(1)

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Desempilha fatorial(1)
fatorial(1)

-> return 1*1

fatorial(2)

-> return 2*fatorial(1)

fatorial(3)
fatorial(4)

-> return 3*fatorial(2)
-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Desempilha fatorial(2)
fatorial(2)

-> return 2*1*1

fatorial(3)

-> return 3*fatorial(2)

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Desempilha fatorial(3)
fatorial(3)

-> return 3*2*1*1

fatorial(4)

-> return 4*fatorial(3)
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Desempilha fatorial(4)
fatorial(4)

-> return 4*3*2*1*1
*
Função fatorial
▪

Considere, novamente, o exemplo para 4!:

Resultado = 24

*
Recursividade
"Para fazer um procedimento recursivo é preciso ter fé.”
prof. Siang Wun Song

*
Recursividade
"Para fazer um procedimento 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.” Aluno S.Y., 1998

*
Recursividade
"Para fazer um procedimento 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.” Aluno S.Y., 1998

"To understand recursion, we must first understand recursion.” —anônimo

*
Funções recursivas
• Base do paradigma funcional.
– ○ Lisp, Haskell, Miranda, F#, Scheme, Erland
– Influenciou diversas: JavaScript, Python,Ruby, Lua

• Presente em praticamente todas as linguagens,
mesmo as imperativas, como
– C, Java, Pascal, ADA ...

*
Funções recursivas
• Muitos algoritmos complexos são resolvidos através
de soluções recursivas
– Quick-sort (ordenação rápida)
– Ordenação por intercalação (merge sort)
– Busca binária

• Muitas estruturas de dados são recursivas
– Listas encadeadas
– Árvores binárias, n-árias ...

• Tendem a gerar códigos menores

*
Recursividade - Natureza

*
Recursividade - Natureza

*
Vamos fazer mais um
exercício. Na atividade de
aprofundamento tem mais
exercícios. Tentem fazer e
postem suas dúvidas.
Exercício resolvido
• Codifiquem uma função que multiplica um dado
inteiro “a” por um inteiro “b”, usando somas
sucessivas. Exemplo:
• 4 * 3 = 3+ 3+ 3 +3 = 12
Exercício resolvido
int mult (int a, int b) {

}
Exercício resolvido
int mult (int a, int b) {
if (a == 0)
return

}
Exercício resolvido
int mult (int a, int b) {
if (a == 0)
return 0;

}
Exercício resolvido
int mult (int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return
}
Exercício resolvido
int mult (int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return b;
}
Exercício resolvido
int mult (int a, int b) {
if (a == 0)
return 0;
if (a == 1)
return b;
return b + mult (a-1,b);
}
Vamos testar ?
Vamos testar ?
mult (3,5)
Vamos testar ?
mult(3,5)=5+mult(2,5)
Vamos testar ?
mult(3,5)=5+mult(2,5)
=5+5+mult(1,5)
Vamos testar ?
mult(3,5)=5+mult(2,5)
=5+5+mult(1,5)
=5+5+5
Vamos testar ?
mult(3,5)=5+mult(2,5)
=5+5+mult(1,5)
=5+5+5
= 15
Exercícios
1. Faça uma função recursiva que calcula a divisão usando subtrações
sucessivas
int div (int a, int b);
2. Faça uma função recursiva que calcula o resto de uma divisão usando
subtrações sucessivas.
int mod (int a, int b);
3.Faça uma função recursiva que calcula a potencia de um numero usando
multiplicações sucessivas.
int pot (int base, int exp);
4. Faça uma função recursiva que calcula a quantidade de caracteres em uma
string.
int tamanho (char *str)
5. Fazer uma função recursiva que calcule o valor da série S descrita a seguir
para um valor n > 0 a ser fornecido como parâmetro para a mesma:
S = 1 + 1/2! + 1/3! + ... 1/n!
Tipos Recursivos
Um tipo recursivo é definido em termos de si.
Exemplos de tipos recursivos:
● listas
● árvores
A cardinalidade de tipos recursivos é infinita.
Os números naturais é outro exemplo de tipos recursivos
Axiomas de Peano
O matemático Giuseppe Peano (1858-1932) apresentou alguns axiomas sobre números
naturais, que ficaram posteriormente conhecidos como os Axiomas de Peano. Nele
precisamos admitir três conceitos primitivos. São eles: zero (denotado por 0), número
natural e a noção de sucessor de um número natural. Estes axiomas são listados abaixo:
(A1) 0 (zero) é um número natural e não é sucessor de
um número natural2.
(A2) Todo número natural tem um único sucessor,
que também é um número natural.
(A3) Se dois números naturais tem o mesmo sucessor,
então eles são iguais entre si.
(A4) Se um subconjunto S dos números naturais
possui o elemento zero e também o sucessor de todos
os elementos de S, então S é igual ao conjunto dos
números naturais.
Tipos Recursivos - Naturais
Exemplos:
0 -> Zero
Tipos Recursivos - Naturais
Exemplos:
0 -> Zero
1 -> Succ (Zero)
Tipos Recursivos - Naturais
Exemplos:
0 -> Zero
1 -> Succ (Zero)
2- > Succ ( Succ (Zero))
Tipos Recursivos - Naturais
Exemplos:
0 -> Zero
1 -> Succ (Zero)
2- > Succ ( Succ (Zero))
3- > Succ ( Succ ( Succ (Zero)))
...
Numeros Naturais
typedef struct Nat {
struct Nat* ant;
}* Nat;

Definição da estrutura. Observe a
recursão.

Função que define o Zero
Nat Zero () {
return NULL;
}
Nat Succ (Nat a) {
Nat n = malloc (sizeof (Nat));
Função que retorna o
n->ant = a;
sucessor de um dado a.
return n;
}
Função que retorna o
Nat ant (Nat a) {
antecessor de um dado
return a->ant;
a.
}
Numeros Naturais
typedef struct Nat {
struct Nat* ant;
}* Nat;

Definição da estrutura. Observe a
recursão.

Função que define o Zero
Nat Zero () {
return NULL;
}
Nat Succ (Nat a) {
Nat n = malloc (sizeof (Nat));
Função que retorna o
n->ant = a;
sucessor de um dado a.
return n; Em C, ponteiros é o
}
recurso que nos
Função que retorna o
Nat ant (Nat a) {
permite definir tipos
antecessor de um dado
return a->ant;
recursivos
a.
}
Numeros Naturais
Se b é o número 1, então a + b é definido como sucessor de a. Por
outro lado, se b fosse 2, a + b seria definido como sucessor de a + 1.
Ou seja, a + c é o sucessor de a + b, onde b é o antecessor de c. Isso
pode ser descrito na seguinte função:
Nat sum (Nat
if (c ==
return
else {
return
}
}

a, Nat c) {
Zero () )
a;
Succ ( sum

(a, ant(c)));
Numeros Naturais
A multiplicação pode ser definida em termos de soma
sucessivas.

Nat mult (Nat a, Nat b) {
if (a == Zero () )
return Zero ();
else
return sum (b, (mult (b, ant(a))));
}
Numeros Naturais
A multiplicação pode ser definida em termos de soma
sucessivas.

Nat mult (Nat a, Nat b) {
if (a == Zero () )
return Zero ();
else
return sum testem o
Baixem e (b, (mult (b, ant(a))));
}
código.
Atividade
1. Codifiquem a divisão inteira.
2. Codifiquem a função que retorna o resto de uma divisão
inteira, ou seja, equivalente ao operador %.

Mais conteúdo relacionado

Mais procurados

Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
Alvaro Oliveira
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
Adriano Teixeira de Souza
 
Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
Adriano Teixeira de Souza
 

Mais procurados (20)

Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP Básico
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)
 
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
 
Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcional
 
Lógica de programação em ppt
Lógica de programação em pptLógica de programação em ppt
Lógica de programação em ppt
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Algoritmos e Programação: Matrizes
Algoritmos e Programação: MatrizesAlgoritmos e Programação: Matrizes
Algoritmos e Programação: Matrizes
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Aula 5 encapsulamento, associação, polimorfismo, interfaces
Aula 5   encapsulamento, associação, polimorfismo, interfacesAula 5   encapsulamento, associação, polimorfismo, interfaces
Aula 5 encapsulamento, associação, polimorfismo, interfaces
 
Lógica de Programação e Algoritmos
Lógica de Programação e AlgoritmosLógica de Programação e Algoritmos
Lógica de Programação e Algoritmos
 
Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }
 
Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
 
Estrutura de Dados Aula 04 - Listas Estáticas
Estrutura de Dados Aula 04 - Listas EstáticasEstrutura de Dados Aula 04 - Listas Estáticas
Estrutura de Dados Aula 04 - Listas Estáticas
 

Destaque

Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
Regis Magalhães
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
Caique Silva
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
Ricardo Bolanho
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
Rogerio Oliveira
 
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendacionesConferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
Javier González de Dios
 

Destaque (20)

Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
 
Lista funcões e recursividade
Lista funcões e recursividadeLista funcões e recursividade
Lista funcões e recursividade
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - Recursividade
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
 
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
Torre De Hanoi
Torre De HanoiTorre De Hanoi
Torre De Hanoi
 
Rosimar marcano torre de hanoi
Rosimar marcano torre de hanoiRosimar marcano torre de hanoi
Rosimar marcano torre de hanoi
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendacionesConferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
 
Aula1
Aula1Aula1
Aula1
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08
 
Aula 02 Primeiro Cod Java
Aula 02   Primeiro Cod JavaAula 02   Primeiro Cod Java
Aula 02 Primeiro Cod Java
 
Programação Estruturada 2 - Aula 06 - Código Fonte
Programação Estruturada 2 - Aula 06 - Código FonteProgramação Estruturada 2 - Aula 06 - Código Fonte
Programação Estruturada 2 - Aula 06 - Código Fonte
 
Algoritmos e Estrutura de Dados - Aula 05
Algoritmos e Estrutura de Dados - Aula 05Algoritmos e Estrutura de Dados - Aula 05
Algoritmos e Estrutura de Dados - Aula 05
 

Semelhante a Recursividade

Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
samuelthiago
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
Ricardo Bolanho
 
Raciocinio logico aula 2
Raciocinio logico aula 2Raciocinio logico aula 2
Raciocinio logico aula 2
Nilberte
 
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenanEquações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
Renan Gustavo
 

Semelhante a Recursividade (20)

Aula 3
Aula 3Aula 3
Aula 3
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 
Polinômios
PolinômiosPolinômios
Polinômios
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
 
Raciocinio logico aula 2
Raciocinio logico aula 2Raciocinio logico aula 2
Raciocinio logico aula 2
 
Análise Combinatória
Análise CombinatóriaAnálise Combinatória
Análise Combinatória
 
Pesquisa sequencial
Pesquisa sequencialPesquisa sequencial
Pesquisa sequencial
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em C
 
Analise combinatoria.docx
Analise combinatoria.docxAnalise combinatoria.docx
Analise combinatoria.docx
 
TABUADA DE MULTIPLICAÇÃO DINAMIZADA - RESPOSTAS.pptx
TABUADA DE MULTIPLICAÇÃO DINAMIZADA - RESPOSTAS.pptxTABUADA DE MULTIPLICAÇÃO DINAMIZADA - RESPOSTAS.pptx
TABUADA DE MULTIPLICAÇÃO DINAMIZADA - RESPOSTAS.pptx
 
Conceitos fundamentais-de-algoritmos
Conceitos fundamentais-de-algoritmosConceitos fundamentais-de-algoritmos
Conceitos fundamentais-de-algoritmos
 
Conceitos Fundamentais de algoritmos
Conceitos Fundamentais de algoritmosConceitos Fundamentais de algoritmos
Conceitos Fundamentais de algoritmos
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Tnotas
TnotasTnotas
Tnotas
 
ANTONIO CLAUDIO LAGE BUFFARA RESPONDE: QUESTÕES PUC-RIO PERMUTAÇÕES COM PILHAS
ANTONIO CLAUDIO LAGE BUFFARA RESPONDE: QUESTÕES PUC-RIO PERMUTAÇÕES COM PILHASANTONIO CLAUDIO LAGE BUFFARA RESPONDE: QUESTÕES PUC-RIO PERMUTAÇÕES COM PILHAS
ANTONIO CLAUDIO LAGE BUFFARA RESPONDE: QUESTÕES PUC-RIO PERMUTAÇÕES COM PILHAS
 
Álgebra de Boole
Álgebra de BooleÁlgebra de Boole
Álgebra de Boole
 
Programacao logica
Programacao logicaProgramacao logica
Programacao logica
 
Pesquisa e ordenação recursividade
Pesquisa e ordenação   recursividadePesquisa e ordenação   recursividade
Pesquisa e ordenação recursividade
 
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenanEquações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
Equações Algébricas e Transcendentes - Isolamento de Raízes - @professorenan
 
Aula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxppppppAula03 - Princípios de Contagem.ppsxpppppp
Aula03 - Princípios de Contagem.ppsxpppppp
 

Mais de Sérgio Souza Costa

Mais de Sérgio Souza Costa (20)

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicas
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computador
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmos
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficos
 
Modelagem de dados geográficos
Modelagem de dados geográficosModelagem de dados geográficos
Modelagem de dados geográficos
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de Encerramento
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de abertura
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - Introdução
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theorems
 
Turing e o problema da decisão
Turing e o problema da decisãoTuring e o problema da decisão
Turing e o problema da decisão
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cells
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetos
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)
 
Herança e Encapsulamento
Herança e EncapsulamentoHerança e Encapsulamento
Herança e Encapsulamento
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)
 
Abstract classes and interfaces
Abstract classes and interfacesAbstract classes and interfaces
Abstract classes and interfaces
 
Introdução ao Prolog
Introdução ao PrologIntrodução ao Prolog
Introdução ao Prolog
 
Heap - Python
Heap - PythonHeap - Python
Heap - Python
 
Paradigma lógico
Paradigma lógicoParadigma lógico
Paradigma lógico
 

Recursividade

  • 2. Recursividade • Muitas estruturas de dados como listas e árvores são recursivas, então é importante compreender conceito de recursividade. *
  • 3. Recursividade ▪ A recursividade é uma forma de resolver problemas por meio da divisão dos problemas em problemas menores de mesma natureza. ▪ 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. ▪ Quando devemos parar? Quando alcançarmos um caso trivial que conhecemos a solução. *
  • 4. Recursividade • Exemplos de casos triviais: – – – – – Qual o fatorial de 0 ? Quanto é um dado X multiplicado por 1 ? Quanto é um dado X multiplicado por 0 ? Quanto é um dado X elevado a 1 ? Quantos elementos tem em uma lista vazia?
  • 5. Recursividade Assim, um processo recursivo para a solução de um problema consiste em duas partes: ▪ ▪ ▪ ▪ ▪ O caso trivial, cuja solução é conhecida; Um método geral que reduz o problema a um ou mais problemas menores (subproblemas) de mesma natureza. Muitas funções podem ser definidas recursivamente. Para isso, é preciso identificar as duas partes acima. Exemplo: fatorial de um número e o n-ésimo termo da seqüência de Fibonacci. *
  • 6. Função fatorial ▪ A função fatorial de um inteiro não negativo pode ser definida como: ▪ Esta definição estabelece um processo recursivo para calcular o fatorial de um inteiro n. Caso trivial: n=0. Método geral: n x (n-1)!. ▪ ▪ *
  • 7. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir: 4! = *
  • 8. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! *
  • 9. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!)
  • 10. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!))
  • 11. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo de 4!, por exemplo, é feito como a seguir: 4! = 4 * 3! = 4 * (3 * 2!) = 4 * (3 * (2 * 1!)) = 4 * (3 * (2 * (1 * 0!)))
  • 12. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo 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. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo 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. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo 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. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo 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. Função fatorial ▪ Assim, usando-se este processo recursivo, o cálculo 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 Mas como uma função recursiva é de fato implementada no computador? Usando-se o mecanismo conhecido como Pilha de Execução! *
  • 17. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução fatorial(4) -> return 4*fatorial(3) *
  • 18. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 19. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução fatorial(2) -> return 2*fatorial(1) fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 20. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução fatorial(1) -> return 1*fatorial(0) fatorial(2) -> return 2*fatorial(1) fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 21. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução fatorial(0) fatorial(1) -> return 1 (caso trivial) -> return 1*fatorial(0) fatorial(2) -> return 2*fatorial(1) fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 22. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Pilha de Execução Desempilha fatorial(0) fatorial(0) fatorial(1) -> return 1 (caso trivial) -> return 1*fatorial(0) fatorial(2) -> return 2*fatorial(1) fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 23. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Desempilha fatorial(1) fatorial(1) -> return 1*1 fatorial(2) -> return 2*fatorial(1) fatorial(3) fatorial(4) -> return 3*fatorial(2) -> return 4*fatorial(3) *
  • 24. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Desempilha fatorial(2) fatorial(2) -> return 2*1*1 fatorial(3) -> return 3*fatorial(2) fatorial(4) -> return 4*fatorial(3) *
  • 25. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Desempilha fatorial(3) fatorial(3) -> return 3*2*1*1 fatorial(4) -> return 4*fatorial(3) *
  • 26. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Desempilha fatorial(4) fatorial(4) -> return 4*3*2*1*1 *
  • 27. Função fatorial ▪ Considere, novamente, o exemplo para 4!: Resultado = 24 *
  • 28. Recursividade "Para fazer um procedimento recursivo é preciso ter fé.” prof. Siang Wun Song *
  • 29. Recursividade "Para fazer um procedimento 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.” Aluno S.Y., 1998 *
  • 30. Recursividade "Para fazer um procedimento 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.” Aluno S.Y., 1998 "To understand recursion, we must first understand recursion.” —anônimo *
  • 31. Funções recursivas • Base do paradigma funcional. – ○ Lisp, Haskell, Miranda, F#, Scheme, Erland – Influenciou diversas: JavaScript, Python,Ruby, Lua • Presente em praticamente todas as linguagens, mesmo as imperativas, como – C, Java, Pascal, ADA ... *
  • 32. Funções recursivas • Muitos algoritmos complexos são resolvidos através de soluções recursivas – Quick-sort (ordenação rápida) – Ordenação por intercalação (merge sort) – Busca binária • Muitas estruturas de dados são recursivas – Listas encadeadas – Árvores binárias, n-árias ... • Tendem a gerar códigos menores *
  • 35. Vamos fazer mais um exercício. Na atividade de aprofundamento tem mais exercícios. Tentem fazer e postem suas dúvidas.
  • 36. Exercício resolvido • Codifiquem uma função que multiplica um dado inteiro “a” por um inteiro “b”, usando somas sucessivas. Exemplo: • 4 * 3 = 3+ 3+ 3 +3 = 12
  • 37. Exercício resolvido int mult (int a, int b) { }
  • 38. Exercício resolvido int mult (int a, int b) { if (a == 0) return }
  • 39. Exercício resolvido int mult (int a, int b) { if (a == 0) return 0; }
  • 40. Exercício resolvido int mult (int a, int b) { if (a == 0) return 0; if (a == 1) return }
  • 41. Exercício resolvido int mult (int a, int b) { if (a == 0) return 0; if (a == 1) return b; }
  • 42. Exercício resolvido int mult (int a, int b) { if (a == 0) return 0; if (a == 1) return b; return b + mult (a-1,b); }
  • 49. Exercícios 1. Faça uma função recursiva que calcula a divisão usando subtrações sucessivas int div (int a, int b); 2. Faça uma função recursiva que calcula o resto de uma divisão usando subtrações sucessivas. int mod (int a, int b); 3.Faça uma função recursiva que calcula a potencia de um numero usando multiplicações sucessivas. int pot (int base, int exp); 4. Faça uma função recursiva que calcula a quantidade de caracteres em uma string. int tamanho (char *str) 5. Fazer uma função recursiva que calcule o valor da série S descrita a seguir para um valor n > 0 a ser fornecido como parâmetro para a mesma: S = 1 + 1/2! + 1/3! + ... 1/n!
  • 50. Tipos Recursivos Um tipo recursivo é definido em termos de si. Exemplos de tipos recursivos: ● listas ● árvores A cardinalidade de tipos recursivos é infinita. Os números naturais é outro exemplo de tipos recursivos
  • 51. Axiomas de Peano O matemático Giuseppe Peano (1858-1932) apresentou alguns axiomas sobre números naturais, que ficaram posteriormente conhecidos como os Axiomas de Peano. Nele precisamos admitir três conceitos primitivos. São eles: zero (denotado por 0), número natural e a noção de sucessor de um número natural. Estes axiomas são listados abaixo: (A1) 0 (zero) é um número natural e não é sucessor de um número natural2. (A2) Todo número natural tem um único sucessor, que também é um número natural. (A3) Se dois números naturais tem o mesmo sucessor, então eles são iguais entre si. (A4) Se um subconjunto S dos números naturais possui o elemento zero e também o sucessor de todos os elementos de S, então S é igual ao conjunto dos números naturais.
  • 52. Tipos Recursivos - Naturais Exemplos: 0 -> Zero
  • 53. Tipos Recursivos - Naturais Exemplos: 0 -> Zero 1 -> Succ (Zero)
  • 54. Tipos Recursivos - Naturais Exemplos: 0 -> Zero 1 -> Succ (Zero) 2- > Succ ( Succ (Zero))
  • 55. Tipos Recursivos - Naturais Exemplos: 0 -> Zero 1 -> Succ (Zero) 2- > Succ ( Succ (Zero)) 3- > Succ ( Succ ( Succ (Zero))) ...
  • 56. Numeros Naturais typedef struct Nat { struct Nat* ant; }* Nat; Definição da estrutura. Observe a recursão. Função que define o Zero Nat Zero () { return NULL; } Nat Succ (Nat a) { Nat n = malloc (sizeof (Nat)); Função que retorna o n->ant = a; sucessor de um dado a. return n; } Função que retorna o Nat ant (Nat a) { antecessor de um dado return a->ant; a. }
  • 57. Numeros Naturais typedef struct Nat { struct Nat* ant; }* Nat; Definição da estrutura. Observe a recursão. Função que define o Zero Nat Zero () { return NULL; } Nat Succ (Nat a) { Nat n = malloc (sizeof (Nat)); Função que retorna o n->ant = a; sucessor de um dado a. return n; Em C, ponteiros é o } recurso que nos Função que retorna o Nat ant (Nat a) { permite definir tipos antecessor de um dado return a->ant; recursivos a. }
  • 58. Numeros Naturais Se b é o número 1, então a + b é definido como sucessor de a. Por outro lado, se b fosse 2, a + b seria definido como sucessor de a + 1. Ou seja, a + c é o sucessor de a + b, onde b é o antecessor de c. Isso pode ser descrito na seguinte função: Nat sum (Nat if (c == return else { return } } a, Nat c) { Zero () ) a; Succ ( sum (a, ant(c)));
  • 59. Numeros Naturais A multiplicação pode ser definida em termos de soma sucessivas. Nat mult (Nat a, Nat b) { if (a == Zero () ) return Zero (); else return sum (b, (mult (b, ant(a)))); }
  • 60. Numeros Naturais A multiplicação pode ser definida em termos de soma sucessivas. Nat mult (Nat a, Nat b) { if (a == Zero () ) return Zero (); else return sum testem o Baixem e (b, (mult (b, ant(a)))); } código.
  • 61. Atividade 1. Codifiquem a divisão inteira. 2. Codifiquem a função que retorna o resto de uma divisão inteira, ou seja, equivalente ao operador %.