Académique Documents
Professionnel Documents
Culture Documents
Este exemplo é
apenas didático, não
void exemplo_recursao( int p ){ executa nada em
específico…
if (alguma condição de parada)
return;
else
exemplo_recursao(p-1);
}
2 INF 01202 - Prof. Marcelo Walter – Aula 28
RECURSIVIDADE
5! = 5 * 4 * 3 * 2 * 1
Definição:
0! = 1;
n! = n * (n-1)!, para n > 0.
fat = 1;
for (aux = n; aux > 1; aux--) // se n=0 ou 1, não entra no for
{
fat = fat * aux ;
}
3!
3! = 3 * 2 * 1 = 3 * 2!
2!
se N = 0 (ou 1)
fatorial de n ← 1
senão
fatorial de n ← n * fatorial de n-1
int f;
…; 6
…
f = fatorial(3);
printf(“%d”, f);
... 3*2
…
} 2*1
1*1
1
Início da execução
– alocação de variáveis locais
– parâmetros
Processamento
– se a execução for interrompida por nova chamada
recursiva, ocorre o “empilhamento” dos indicadores de
execução atuais (valores, ponto de retorno)
Fim da execução
– liberação de variáveis locais - “desempilhamento”
– retorno ao ponto de chamada
…
#define N 10
int soma_rec (int v[ ], int ultimo)
{
if (ultimo == 0)
return v[0];
else
return v[ultimo] + soma_rec (v, ultimo - 1);
}
int main (void)
{
int numeros[N];
int i;
for (i = 0; i < N; i++)
scanf ("%d", &numeros[i]); // lê valores: incluir printf explicativo
return 0;
}
14 INF 01202 - Prof. Marcelo Walter – Aula 28
Exercício: fazer um programa contendo uma função que calcula a soma dos n
elementos inteiros de um vetor, de forma recursiva. No programa principal,
ler os números e informar a soma.
…
#define N 10
int soma_rec (int v[ ], int ultimo)
{
if (ultimo == 0)
return v[0];
else
return v[ultimo] + soma_rec (v, ultimo - 1);
}
int main (void)
{
int numeros[N];
int i;
for (i = 0; i < N; i++)
scanf ("%d", &numeros[i]); // lê valores: incluir printf explicativo
return 0;
}
15 INF 01202 - Prof. Marcelo Walter – Aula 28
Série de Fibonacci
+ +
1 1 2 3 5 8 13 21 34 55…
fib(1) = 1
fib(2) = 1
fib(n) = fib(n-1) + fib(n-2), para n > 2 55
34
16 INF 01202 - Prof. Marcelo Walter – Aula 28
Cálculo do nésimo termo – NÃO
RECURSIVO (já visto em aula)
int fib (int n) // devolve apenas o nésimo termo
{
// devolve o termo n da série de Fibonacci
int i;
int fibn, fibn_1 = 0, fibn_2 =1; //termos fib(n), fib(n-1) e fib(n-2))
for (i=1; i <= n; i++)
{ //calcula TODOS os termos, inclusive os 2 primeiros:
fibn = fibn_2 + fibn_1;
fibn_2 = fibn_1; //atualiza os antecessores na série
fibn_1 = fibn;
}
return fibn; /* retorna o termo solicitado*/
}
1 1 2 3 5 8 13 ...
FIB (5)?
fib(1) = 1
fib(2) = 1
fib(n) = fib(n-1) + fib(n-2), para n > 2
recursão!
FIB ( 4 ) + FIB ( 3 )
1 1 1
FIB ( 2 ) + FIB ( 1 )
1 1
FIB ( 4 ) + FIB ( 3 )
FIB ( 2 ) + FIB ( 1 )
FIB ( 5 )
FIB ( 4 ) + FIB ( 3 )
FIB ( 2 ) + FIB ( 1 )
redundância!
Desvantagens da Recursividade
• maior ocupação de memória;
• maior tempo de processamento.
}
}
} 2+p(1,1)
1
p ( 7, 3 ) = 10
p(7,3)=?
3+p(7,2) CUIDADO! Recursão
infinita se y < x
2+p(7,1)
1+p(7,0)
29 .......
INF 01202 - Prof. Marcelo Walter – Aula 28
O que faz a subrotina abaixo?
void rv( ) ?
{ ABC#
char ch;
scanf(“%c”, &ch);
if (ch != ´#´)
rv(); ABC# #CBA
#
#CB
#C
printf(“%c”, ch);
}
C A C B C C C #
float f ( float x)
resul = f(3); ?
{
if (x == 0)
return 0; f (3)
else 3 + g (3)
return x + g (x); 4 - f (2)
} 2 + g (2)
4 - f (1)
float g ( float x) 1 + g (1)
{ 4 - f (0)
return 4 - f ( x - 1 ); 0
} 333+++44
34---(2
(2
(2
1 +++4344
2---(1
(1
1
5 ++44--0))
0))↔== 666
REVIVER
REVIVER Removemos 2
caracteres: o
primeiro e o
último
quantos caracteres
return 0;
}
int func_soma(int n)
Algoritmo Ordena_Selecao;
{ordena vetores pelo método de seleção}
Entrada: vetor;
Saída: vetor classificado em ordem crescente;
1. Inicio
2. Para (ind ← 1;ind < num_elem; ind++)
lê vetor[ind]
3. Ordena(vetor,pos_inic, pos_fim) {função}
4. Para (ind ← 1;ind < num_elem; ind++)
imprime vetor[ind]
5 Fim.