Recursividade.pdf
Transcript of Recursividade.pdf
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 1
Aula 02 - Contedo
1) Recursividade 2) Diagramas de Execuo 3) Exerccios
Recursividade
Uma funo dita ser recursiva quando definida em termos de si mesmo, isto
, uma funo recursiva faz a uma chamada a si mesma.
Fatorial de um nmero 0! = 1
1! = 1
2! = 2 . 1! = 2 . 1 = 2
3! = 3 . 2! = 3 . 2 = 6
4! = 4 . 3! = 4 . 6 = 24
5! = 5 . 4! = 5 . 24 = 120
n! = n . (n-1)!
Exemplo 2.1 Fatorial (arquivo Ex201.cpp) #include
long int fat(int n)
{
if ( n < 0 ) return(-1);
if ( n == 0 || n == 1 ) return(1);
return( n * fat(n-1) );
}
void main()
{
int k;
for(k=1; k
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 2
}
A funo acima no eficiente pois ocorrem duas chamadas para o mesmo
nmero. Por exemplo: Fibonacci (6) chama Fibonacci (4) duas vezes. Algumas vezes
uma funo recursiva pode ser substitudo por uma no recursiva mais eficiente.
Durante o estgio do projeto, no se deve forar nem impedir a recursividade.
Na verdade devemos nos concentrar na resoluo do problema de uma maneira clara e
natural. A preocupao excessiva com eficincia no estgio do projeto pode
prejudicar os esforos na resoluo do problema.
Exemplo 2.3 Fibonacci no recursivo (arquivo Ex203.cpp) #include
int FibNR(int n)
{
int i,ant,atual,seg;
if ( n
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 3
n de discos n mnimo de movimentos
1 1
2 3
3 7
4 15
5 31
k 2k -1
Obs: A Torre de Brama implica em 264
-1 = 18.446.744.073.509.551.615
movimentos. Se os sacerdotes realizassem um movemento por segundo, 24 horas por
dia, todos os dias do ano, sem cometer erros, levariam cerca de 6 bilhes de sculos
para realizar a tarefa (ainda bem ...).
Exemplo 2.4 Torre de Hanoi (arquivo Ex204.cpp) #include
void Hanoi(int n,char Orig,char Dest,char Aux)
{
if ( n == 1 )
cout
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 4
{
b = b + 1;
funcA(b);
}
cout > x >> y >> z; // x,y,z sao globais
if (x >= y) P1;
else P2(x);
}
Exemplos de Diagramas de Execuo
Exemplo 2.7 Escopo de variveis e passagem de parmetros (arquivo Ex207.cpp) #include
int a,b,c;
float f;
void P(int x, int y, int &z)
{
z = x + y + z;
}
float Q(int &x, int y)
{
x += y;
y = 3;
return((float) x/7);
}
void main()
{
a = 5; b = 8; c = 4;
cout
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 5
cout
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 6
lin 2 1 1
lin 3 1 2 1
lin 4 1 3 3 1
lin 5 1 4 6 4 1
Lin 6 1 5 10 10 5 1
: : : : : : : ...
int Pascal(int lin , int col )
Exemplos:
Pascal(4,2) retorna 3 (linha 4 e coluna 2 )
Pascal(6,4) retorna 10 (linha 6 e coluna 4)
Pascal(9,1) retorna 1 (linha 9 e coluna 1)
2.04) Desenvolva um algoritmo recursivo em linguagem C para a Funo de
Ackerman:
definio da funco de Ackerman:
a(m.n) = 1 se m = 0
a(m,n) = a(m-1,1) se m != 0 e n = 0
a(m,n) = a(m-1,a(m,n-1)) se m != 0 e n != 0
int Ackerman(int a , int b )
2.05) Suponha a existncia de um vetor de inteiros
#define MAX 10;
int Vet[MAX];
a) escreva uma funo recursiva para somar o n primeiros elementos de Vet
int VetSoma(int A[],int n) (n o tamanho do vetor)
b) escreva uma funo recursiva para encontrar o maior elemento de Vet
int VetMaior(int A[],int n) ( n o tamanho do vetor)
c) escreva um procedimento recursivo para inverter Vet. Repare que as
variveis inic e fim so as posies inicial e final do vetor. void VetInv(int A[],int inic,int fim)
2.06) Faa o Diagrama de Execuo para o programa abaixo (arquivo
Ex209.cpp): #include
int a,b,c;
void R(int &a, int b, int c)
{
a += 8; b += 8; c += 8;
cout
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 7
{
a = 1; b = 1; c = 1;
cout
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 8
2.04) Funo de Ackerman: int Ackerman(int m, int n)
{
if ( m == 0 ) return(1);
else
{
if ( n == 0 ) return(Ackerman(m-1,1));
else return(Ackerman(m-1, Ackerman(m,n-1)));
}
}
2.05) Funes recursivas com vetor
a) Soma dos elmentos de um vetor - VetSoma int VetSoma(int A[], int n)
{
if ( n == 1 ) return(A[0])
else return(A[n-1] + VetSoma(A,n-1));
}
b) Maior elemento de um vetor - VetMaior int VetMaior(int A[], int n)
{
int aux;
if ( n == 1 ) return(A[0]);
else
{
aux = VetMaior(A,n-1);
if ( aux > A[n-1] ) return(aux);
else return(A[n-1]);
}
}
c) Inverter os elementos de um vetor - VetInv void VetInv(int A[], int inic, int fim)
{
int aux;
if ( inic < fim )
{
aux = A[inic];
A[inic] = A[fim];
A[fim] = aux;
VetInv(A,inic+1,fim-1);
}
}
2.06) Diagrama de Execuo
Resposta:
Funo R: 17 17 17
Funo Q: 17 9 9
Funo P: 17 9 4
Funo Main: 17 9 4
2.07) Diagrama de Execuo
Resposta: 1125 0 512
2.08) Diagrama de Execuo
-
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 9
Caro aluno, este exerccio por sua conta. Divirta-se.
2.09) Diagrama de Execuo
Caro aluno, este exerccio por sua conta. Divirta-se.