Você está na página 1de 22

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

INSTITUTO METRÓPOLE DIGITAL


IMD0030 - LINGUAGENS DE PROGRAMAÇÃO I

Aula 2
Performance e Expressividade
Tipos de Recursão
Recursão x Interação
Desenvolvimento e Aplicações de Algoritmos de Ordenação

Antonino Feitosa
antonino_feitosa@yahoo.com.br
RECURSIVIDADE

 Processo definido em termos dele próprio.


 Em linguagens de programação aparece geralmente em
dois casos:
 Função chamando ela própria
 Tipo de dado recursivo (aulas futuras)

 Técnica de desenvolvimento de algoritmos recursivos:


 Dividir e Conquistar

Figura 1: disponível em: <http://clubedosgeeks.com.br/programacao/o-que-e-recursividade> Acesso em set 2020.


PERFORMANCE E EXPRESSIVIDADE

Programa 4 – Fatorial Iterativo Programa 5 – Fatorial Recursivo

int fatorial(int n){ int fatorial(int n){


int valor = 1; if(n == 0 || n == 1){
for(int i=n;i>=1;i--){ return 1;
valor = valor * i; } else {
} return n * fatorial(n - 1);
return valor; }
} }
RECURSIVIDADE – PERFORMANCE E EXPRESSIVIDADE

 Em geral, execuções de versões iterativas são mais rápidas ou


equivalentes a sua versão recursiva
 Funções recursivas utilizam memória para salvar o contexto de
execução
 Alguns problemas são inerentemente recursivos de modo que o uso de
uma implementação recursiva é natural
TIPOS DE RECURSÃO – RECURSÃO DIRETA

 Funções recursivas podem ser Programa 5 – Fatorial Recursivo


classificadas em diretas ou
indiretas int fatorial(int n){
if(n == 0 || n == 1){
 Uma função recursiva direta return 1;
invoca ela mesma. } else {
return n * fatorial(n - 1);
 Uma função recursiva indireta }
}

invoca ela mesma através de


outra função.
TIPOS DE RECURSÃO – RECURSÃO INDIRETA

Programa 6 – Recursão Indireta 1 Programa 7 – Recursão Indireta 2

void function_a(){
void function_a(){ function_b();
function_b(); }
}
void function_b(){
void function_b(){ function_c();
function_a(); }
}
void function_c(){
function_a();
}
RECURSÃO – ORDEM DAS CHAMADAS

Programa 8 – Print Recursivo

void recursiveFunction(int num){


if (num < 5){
printf("%d\n", num);
recursiveFunction(num + 1);
}
}

Figura 2: disponível em: <https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)> Acesso em


set 2020.
RECURSÃO – ORDEM DAS CHAMADAS

Programa 9 – Print Recursivo

void recursiveFunction(int num){


if (num < 5){
recursiveFunction(num + 1);
printf("%d\n", num);
}
}

Figura 3: disponível em: <https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)> Acesso em


set 2020.
RECURSÃO – ORDEM DAS CHAMADAS
RECURSÃO EM CAUDA

 Função recursiva em que a última Programa 5 – Fatorial Recursivo


instrução corresponde a chamada
recursiva.
int fatorial(int n){
 Pode ser otimizada pelo compilador if(n == 0 || n == 1){
uma vez que não é necessário salvar return 1;
o contexto. } else {
return n * fatorial(n - 1);
 O programa 5 não é uma recursão }
em cauda apesar da chamada }
recursiva estar na última linha.
RECURSÃO EM CAUDA

Programa 5 – Fatorial Recursivo Programa 10 – Fatorial em Cauda

int fatorial(int n){ int fatorial(int n, int fat){


if(n == 0 || n == 1){ if(n == 0 || n == 1){
return 1; return fat;
} else { } else {
return n * fatorial(n - 1); return fatorial(n–1, fat*n);
} }
} }

// result = fatorial(n, 1)
ALGORITMOS DE ORDENAÇÃO

 Suponha um vetor de inteiros de 𝑛 posições


 Organize os elementos do vetor para satisfazer:
 A primeira posição contém o menor elemento do vetor
 A segunda contém o segundo menor elemento
 A terceira contém o terceiro menor elemento
 Assim por diante até a última contenha o maior
ALGORITMOS DE ORDENAÇÃO – EXEMPLO

Entrada: <1, 6, 4, 3, 8, 9, 0, 5, 6, 5>

Saída: <0, 1, 3, 4, 5, 5, 6, 6, 8, 9>


ALGORITMO DE ORDENAÇÃO POR SELEÇÃO
SELECTION SORT

 Passe por cada posição i iniciando na Programa 8 – Troca de Valores


primeira até a 𝑛
 Selecione o menor elemento 𝑗 entre 𝑖 e 𝑛 int vet [3] = {1, 2, 3};
int i = 0;
 Troque os elementos nas posições 𝑖 e 𝑗 int j = 1;

int aux = vet[i];


vet[i] = vet[j]
vet[j] = aux;

// {2, 1, 3}
ALGORITMO DE ORDENAÇÃO POR SELEÇÃO
SELECTION SORT

Figura 4: disponível em: <https://www.devmedia.com.br/algoritmos-de-ordenacao-analise-e-comparacao/28261> Acesso em set


2020.
Figura 5: disponível em: <https://pt.wikipedia.org/wiki/Selection_sort> Acesso em set 2020.
ALGORITMO DE ORDENAÇÃO POR INSERÇÃO
INSERTION SORT

Figura 6: disponível em: <https://www.geeksforgeeks.org/insertion-sort/> Acesso em set 2020.


Figura 7: disponível em: <https://www.devmedia.com.br/algoritmos-de-ordenacao-analise-e-comparacao/28261> Acesso em set
2020.
ALGORITMO DE ORDENAÇÃO BOLHA
BUBBLE SORT

Figura 8: disponível em: <https://pt.wikipedia.org/wiki/Bubble_sort> Acesso em set 2020.


Figura 9: disponível em: <https://www.devmedia.com.br/algoritmos-de-ordenacao-analise-e-comparacao/28261> Acesso em set
2020.
ALGORITMO DE ORDENAÇÃO POR INTERCALAÇÃO
MERGE SORT

Figura 10: disponível em: <https://pt.wikipedia.org/wiki/Merge_sort> Acesso em set 2020.


Figura 11: disponível em: <https://systevolution.wordpress.com/2011/10/26/metodo-mergesort/> Acesso em set 2020.
MERGE SORT
Programa 9 – Merge Sort
void merge(int result[], int left [], int nl, int right [], int nr);

void sort(int result [], int values [], int n){


if(n == 1){
result[0] = values[0];
} else if(n > 1){
int mid = n / 2;
int left [mid];
int right [n - mid];
sort(left, values, mid);
sort(right, values + mid, n - mid);
merge(result, left, mid, right, n - mid);
}
}
ALGORITMO DE ORDENAÇÃO RÁPIDA
QUICK SORT

Figura 12: disponível em: <https://en.wikipedia.org/wiki/Quicksort> Acesso em set 2020.


Figura 13: disponível em: <https://www.tutorialspoint.com/data_structures_algorithms/quick_sort_algorithm.htm> Acesso
em set 2020.
QUICK SORT
Programa 10 – Quick Sort

void quickSort(int values [], int min, int max){


int i = min;
int j = max – 1;

if(j > min){


quickSort(values, min, j+1);
}
if(i < max){
quickSort(values, i, max);
}
}
DÚVIDAS?

Você também pode gostar