engenharia de controle e automaÇÃo - ct -...
TRANSCRIPT
Engenharia de CONTROLE e AUTOMAÇÃO
Estrutura de Dados Conceitos Iniciais
Aula 04
Prof. Rafael Concatto [email protected]
DPEE 1038 –
Estrutura de Dados para AutomaçãoCurso de Engenharia de Controle e Automação
Universidade Federal de Santa Maria
1/5
2Prof. Rafael Concatto Beltrame
•
Recursividade–
Definição
–
A função fatorial–
A sequência de Fibonacci
Sumário
1/5
3Prof. Rafael Concatto Beltrame
•
Um procedimento recursivo é
aquele que contém, em sua descrição, uma ou mais chamadas a si mesmo
–
Todo o procedimento deve possuir uma chamada externa–
Em um procedimento não‐recursivo,todas as chamadas são externas
–
A [quase] todo procedimento recursivocorresponde um outro não‐recursivo
Recursividade
Definição
1/5
4Prof. Rafael Concatto Beltrame
•
Dado um inteiro positivo n, o fatorial de n
é
definido como o produto de todos os inteiros entre n
e 1
–
Exemplo: 5! = 5 * 4 * 3 * 2 * 1 = 120–
Por definição: 0! = 1
•
Algoritmo
A função fatorial
n! = 1, se n == 0n! = n * (n-1) * (n-2) * ... * 1, se n > 0
0! = 11! = 12! = 2 * 13! = 3 * 2 * 1...
1/5
5Prof. Rafael Concatto Beltrame
•
Algoritmo em C –
Método iterativo
Com repetição explícita de um processo
•
Observar que o fatorial pode, também, ser escrito–
Método recursivo
Chamada a si mesmo
A função fatorial
fatorial = 1;
for (x = n; x > 0; x--)fatorial = fatorial * x;
0! = 11! = 1 * 0!2! = 2 * 1!3! = 3 * 2!...
n! = 1, se n == 0n! = n * (n-1)!, se n > 0
1/5
6Prof. Rafael Concatto Beltrame
•
Uma função recursiva exige o conhecimento do resultado anterior
–
Cada caso é reduzido a um caso mais simples até
a definição inicial
A função fatorial
1)
5! = 5*4!2)
4! = 4*3!
3)
3! = 3*2!4)
2! = 2*1!
5)
1! = 1*0!6)
0! = 1
1/5
7Prof. Rafael Concatto Beltrame
•
Cada função “interna”
tem um conjunto local de variáveis–
Podem possuir o mesmo nome
–
Mas não são vistas
pela função “externa”–
As variáveis ficam, então, armazenadas na “pilha” do sistema
A função fatorial
Fatorial (5)5 * Fatorial (5 -
1)
4 * Fatorial (4 -
1)3 * Fatorial (3 -
1)
2 * Fatorial (2 -
1)1 * Fatorial (1 -
1)
1
1/5
8Prof. Rafael Concatto Beltrame
•
A função fatorial em C
A função fatorial
int fact(n) // Função fatorialint n;
{int x, y;
if
(n == 0) // Condição de saídareturn(1);
else
{x = n –
1;
y = fact(x); // Chamada recursiva
return(n * y); // Ponto de retorno}
}
1/5
9Prof. Rafael Concatto Beltrame
A função fatorial
printf("%d", fact(4));
n x y
4 – –
n x y
34
–3 –
n x y
234
–23
–––
n x y
1234
–123
––––
n x y
01234
–123
–––––
n x y
1234
0123
1–––
n x y
234
123
1––
n x y
34
23
2–
n x y
4 3 6
n x y n x y
**
*
fact(4) fact(3) fact(2) fact(1) fact(0)
y=fact(0) y=fact(1) y=fact(2) y=fact(3) printf("%d", fact(4))
*
1/5
10Prof. Rafael Concatto Beltrame
•
Cada elemento n
é a soma dos dois elementos anteriores (n
– 2) e (n
– 1)
–
Exemplo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
•
Algoritmo recursivo
A sequência de Fibonacci
fib(n) = n, se n == 0 ou n == 1fib(n) = fib(n-2) + fib(n-1), se n >= 2
fib(4) = fib(2) + fib(3)= fib(0)
+ fib(1)
+ fib(3)
= 0 + 1 + fib(1)
+ fib(2)= 0 + 1 + 1 + fib(0)
+ fib(1)
= 0 + 1 + 1 + 0 + 1= 3
1/5
11Prof. Rafael Concatto Beltrame
•
Aplicações–
Matemática:
máximo divisor comum (MDC)
–
Informática:
computação paralela–
Estudo de sistemas biológicos
A sequência de Fibonacci
1/5
12Prof. Rafael Concatto Beltrame
•
Observar que a sequencia de Fibonacci
–
Difere da definição recursiva de fatorial–
Já
que fib( )
refere‐se a si mesma por duas vezes
–
Ocorre uma grande redundância computacional•
No exemplo anterior, fib(1) é calculada três vezes
•
Alternativa:
“lembrar”
dos valores anteriores da série
A sequência de Fibonacci
1/5
13Prof. Rafael Concatto Beltrame
•
Implementação usando método iterativo–
Nesse caso, mais eficiente que o recursivo
por evitar repetição de
cálculos
A sequência de Fibonacci
if
(n
<= 1) // Se 0 ou 1
return(n);
low_fib
= 0; // Números anteriores
high_fib
= 1; // da série
for (i = 2; i <= n; i++) { // Método iterativox = low_fib;low_fib
= high_fib;
high_fib
= x + low_fib;
}return(high_fib);
1/5
14Prof. Rafael Concatto Beltrame
•
Não deve gerar uma sequência infinita de chamadas a si mesmo
–
Para, no mínimo, um argumento, a função recursiva f
() deve ser definida de modo a não envolver f () novamente
–
Deve existir uma “saída”
da sequência de chamadas recursivas
–
Saídas•
Fatorial
0! = 1
•
Sequência de Fobonacci
fib(0) = 0; fib(1) = 1;
Propriedades dos Algoritmos Recursivos
1/5
15Prof. Rafael Concatto Beltrame
•
Iteração–
Cada uma das repetições de um comando de é devida ao emprego de
um laço–
Diversos problemas resolvidos de forma recursiva podem ser
resolvidos de forma iterativa (e vice‐versa)
•
Chamadas recursivas
devem salvar o “contexto”
do programa –
O “contexto”
precisa ser recuperado
após a execução de cada
chamada recursiva–
O programa deve retornar imediatamente após ao ponto da chamada
recursiva–
O conteúdo das variáveis
precisa ser recuperado (salvos na pilha)
Revisão: Recursão versus
Iteração
1/5
16Prof. Rafael Concatto Beltrame
•
Há
problemas que não podem ser resolvidos de forma iterativa
–
Percorrer uma árvore
de dados para encontrar um elemento
•
A recursão é muito útil na resolução de diversos problemas que possam se beneficiar do “dividir‐para‐conquistar”
–
Ordenação por meio de quicksort
ou mergesort–
Diversas técnicas de busca em grafos
Revisão: Recursão versus
Iteração