Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
1/48
BCC 201 - Introducao a Programacao I
Recursividade
Guillermo Camara-ChavezUFOP
2/48
Introducao I
I Recursividade: e um metodo de programacao no qual umafuncao pode chamar a si mesma
I Muitas estruturas tem natureza recursiva:I Estruturas encadeadasI Fatorial, serie FibonacciI Uma pasta que contem outras pastas e arquivos
3/48
Introducao II
Uma forma visual de recursividade conhecida como efeitoDroste
4/48
Introducao III
5/48
Introducao IV
I Recursao matematicaI Como definir recursivamente a seguinte soma?
n∑k=m
k = m + (m + 1) + . . . + (n − 1) + n
6/48
Introducao V
I Primeira definicao recursiva
n∑k=m
k
{m se n = m
n +∑n−1
k=m k se n > m
7/48
Introducao VI
I Recursao na computacao
f l o a t soma ( f l o a t m, f l o a t n ) ;i n t main ( ){
f l o a t s ;s = soma (5 , 8 ) ;cout << s ;r e t u r n 0 ;
}f l o a t soma ( f l o a t m, f l o a t n ){
i f (m = = n)r e t u r n m;
e l s er e t u r n ( n + soma (m, n−1)) ;
}
Na tela e mostrado:26
8/48
Pilha de execucao I
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
9/48
Pilha de execucao II
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
10/48
Pilha de execucao III
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
11/48
Pilha de execucao IV
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
12/48
Pilha de execucao V
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
13/48
Pilha de execucao VI
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
14/48
Pilha de execucao VII
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
15/48
Pilha de execucao VIII
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
16/48
Pilha de execucao IX
A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.
17/48
Estouro de pilha de execucao I
I O que acontece se a funcao nao tiver um caso base (ponto deparada)?
I O sistema de execucao nao consegue implementar infinitaschamadas
18/48
Fatorial I
n! =
{1 se n = 0
n ∗ (n − 1)! se n > 0
19/48
Fatorial II
i n t f a t o r i a l ( i n t n ){i f ( n = = 0)
r e t u r n 1 ;e l s e
r e t u r n n ∗ f a t o r i a l ( n−1);}
20/48
Potencia I
xn =
{1 se n = 0
x ∗ xn−1 se n > 0
21/48
Potencia II
doub l e po t e n c i a ( doub l e x , i n t n ){
i f ( n = = 0)r e t u r n 1 ;
e l s er e t u r n x ∗ po t e n c i a ( x , n−1);
}
22/48
Exemplos I
O maximo divisor comum de dois numeros inteiros positivos podeser calculado, utilizando o metodo de Euclides, cujo algoritmo edado pela seguinte relacao de recorrencia:
mcd(m, n) =
{m, se n = 0mcd(n,m%n), se n 6= 0
23/48
Exemplos II
i n t mdc( i n t m, i n t n ){
i f ( n = = 0)r e t u r n m;
e l s er e t u r n mdc(n , m % n ) ;
}
24/48
Exemplos III
Escrever um programa que leia do teclado dois numeros inteirospositivos que correspondem ao numerador e denominador de umafraccao, permita reduzir a fraccao e escreva no monitor a fraccaoreduzida assim como o seu quociente.
25/48
Exemplos IV
i n t mdc( i n t , i n t ) ;v o i d r e d u z i r ( i n t , i n t , i n t &, i n t &);i n t main ( ){
i n t num , den , n num , n den ;cout << "Inserir fraccao: numerador , denominador \n" ;c i n >> num >> den ;r e d u z i r (num , den , n num , n den ) ;cout << num <<"/"<< den <<"=" << n num <<"/"<< n den ;r e t u r n 0 ;
}
26/48
Exemplos V
vo i d r e d u z i r ( i n t num , i n t den , i n t& n num , i n t& n den ){
i n t f a t o r = mdc (num , den ) ;n num = n num / f a t o r ;n den = n den / f a t o r ;
}i n t mdc( i n t m, i n t n ){
i f ( n == 0)r e t u r n m;
e l s er e t u r n mdc(n , m % n ) ;
}
27/48
Exemplos VI
Encontrar a soma dos elementos de um vetor
28/48
Exemplos VII
i n t soma ( i n t ∗ vet , i n t n ) ;i n t main ( ){
i n t A [ 5 ] = {3 , 5 , 8 , 23 , 9} ;cout << soma (A, 5 ) ;r e t u r n 0 ;
}i n t soma ( i n t ∗ vet , i n t n ){
i f ( n = = 1)r e t u r n ve t [ 0 ] ;
e l s er e t u r n ve t [ n−1] + soma ( vet , n−1);
}
29/48
Standard Template Library (STL) I
I A biblioteca STL contem:I contenedor (container)I algoritmos (algorithm)I iteradores (iterator)
I Um contenedor e a forma como um conjunto de dadosarmazenados esta organizado em memoria
I Os algoritmos sao procedimentos que sao aplicados acontenedor para processar os dados
I Um iterador e um tipo de ponteiro que aponta elementosdentro de um contenedor
30/48
Contenedores I
I Um contenedor e uma forma de armazenar os dados
I O STL prove varios tipos de contenedoresI <vector> : vetor unidimensionalI <list>: lista duplamente encadeadaI <deque>: fila de duas pontasI <queue>: filaI <stack>: pilha
31/48
Contenedores sequencias I
I Um contenedor sequencial armazena um conjunto de dadosem sequencia, <vector>, <list>, <dequeue> saocontenedores sequencias
I Em um vetor tradicional C++ o tamanho e fixo e nao podemudar durante a execucao. Alem disso, e tedioso inserir eapagar elementos. Vantagem: rapido acesso
32/48
Contenedores sequencias II
I Um <vector> e como um arranjo comum nos seguintescasos:
I Um <vector> contem uma sequencia de valores ou elementosI Um <vector> armazena seus dados em forma sequencialI Pode ser usado o operador [] para acessar elementos individuais
33/48
Contenedores sequencias III
I Existem varias vantagens com respeito aos vetores comunsI Nao e necessario declarar o numero de elementosI Se e adicionado um novo elemento num <vector> que se
encontra cheio, automaticamente incrementa de tamanhoI Os <vector> podem retornar como resposta a quantidade de
elementos que eles contem
34/48
Declarando um vector I
I Deve ser incluıda a biblioteca #include<vector>
I Logo deve ser declarado um objeto do tipo <vector>
vec to r<i n t> numeros ;
I Declara numeros como um vetor de inteiros
35/48
Declarando um vector II
I Tambem pode se declarar um vetor com um tamanho inicial
vec to r<i n t> numeros ( 1 0 ) ;
Declaracao Descricaovector<float> V Declara V como um vetor de
float vaziovector<int> V(15) Declara V como um vetor de
int de 15 elementosvector<char> V(25,’A’) Declara V como um vetor de
15 caracteres, todos inicializa-dos com ’A’
vector<double> V(B) Declara V como um vetor dedouble. Todos os valores deB, tambem double sao copia-dos em V
36/48
Recuperando e salvando dados em um vector I
I Para acessar um valor em um posicao existente dentro devetor, pode ser usado o operador []
#i n c l u d e <vec to r>i n t main ( ){
vec to r<i n t> V( 5 ) ;f o r ( i n t i = 0 ; i < 5 ; i++){
cout << "Digite um valor" ;c i n >> V[ i ] ;
}f o r ( i n t i = 0 ; i < 5 ; i++){
cout << V[ i ] << " " ;}r e t u r n 0 ;
}
37/48
Metodos (funcoes) implementadas na class vector I
I size(): retorna o numero de elementos
I resize(): modifica o tamanho alocado
I empty(): confere se o vetor esta vazio
I begin() e end(): iteram o vetor
I at(i): acessa a posicao i
I front() e back(): acessam o primeiro e o ultimo elementos
I erase(): remove um elemento especıfico
I push_back(): adiciona o elemento T no fim
I pop_back(): remove o elemento do fim
I insert(i,T); adiciona um elemento T na posicao i ,empurrando os elementos
I clear(): limpa todo o vetor, deixando vazio
38/48
Usando a funcao push back e pop back I
i n t a r r a y [ 5 ] = {12 , 7 , 9 , 21 , 13} ;v e c to r<i n t> V( a r ray , a r r a y +5);
39/48
Usando a funcao push back e pop back II
I O operador [] nao pode ser usado para acessar um elementoque nao existe
I Para inserir um valor em um <vector> vazio, ou se eleencontra-se cheio, usamos a funcao push_back
V. push back ( 2 5 ) ;
40/48
Usando a funcao push back e pop back III
#i n c l u d e <vec to r>i n t main ( ){
vec to r<double> V;doub l e tmp ;f o r ( i n t i = 0 ; i < 5 ; i++){
cout << "Digite um valor: " ;c i n >> tmp ;V . push back ( tmp ) ;
}f o r ( i n t i = 0 ; i < V. s i z e ( ) ; i++){
cout << V[ i ] ; // V . at ( i )}r e t u r n 0 ;
}
41/48
Usando a funcao push back e pop back IV
#i n c l u d e <vec to r>#i n c l u d e <i o s t r eam>i n t main ( ){
// v e t o r padrao Ci n t a r r [ ] = { 12 , 3 , 17 , 8 } ;// i n i c i a l i z a v com o v e t o r a r rv ec to r<i n t> v ( a r r , a r r +4);// enquanto nao e s t e j a v a z i owh i l e ( ! v . empty ( ) ){
// mostra o u l t imo e lementocout << v . back ( ) << " " ;// apaga o u l t imo e lementov . pop back ( ) ;
}cout << end lr e t u r n 0 ;
}
42/48
Usando a funcao push back e pop back V
t emp la t e <typename T>vo i d Most rar ( v ec to r<T>& v ){
f o r ( un s i gned i n t i = 0 ; i < v . s i z e ( ) ; i++)cout << v [ i ] << " " ;
cout << end l ;}i n t main ( ){
i n t n [ ] = { 4 , 6 , 7 , 9 , 1 } ;v e c to r<i n t> v (n , n+5);cout << "Tradicional \n" ; Most rar ( v ) ;cout << "\n Com o operador at \n" ;f o r ( un s i gned i n t i = 0 ; i < v . s i z e ( ) ; i++)
cout << v . a t ( i ) << " " ;
v . e r a s e ( v . beg i n ( ) + 2 ) ; cout << "\n Removendo: \n" ;Most rar ( v ) ;
v . i n s e r t ( v . beg i n ( ) + 2 , 200 ) ; cout << "\n Inserindo \n"
Mostrar ( v ) ; r e t u r n 0 ;}
43/48
Iteradores I
44/48
Iteradores II
I Permite acessar sequencialmente elementos em um contenedor
I E uma generalizacao do ponteiro
I Deve permitir:I mover para o inicioI avancar para o proximo elementoI retornar o valor referenciadoI verificar se esta no final
45/48
Iteradores III
i n t main ( ){i n t n [ ] = { 4 , 6 , 7 , 9 , 1 } ;v e c to r<i n t> v (n , n+5);
cout << "Mostrando o vetor" ;f o r ( v ec to r<i n t > : : i t e r a t o r i = v . beg i n ( ) ;
i != v . end ( ) ; i++)cout << ∗ i ;
r e t u r n 0 ;}
46/48
Instrucao for com base em intervalo I
Para realizar operacoes com cada um dos elementos de um<vector>, a forma mais segura de realizar e atraves do uso de umcomando introduzido no novo padrao: comando for com base emintervalo
f o r ( d e c l a r a c a o : e x p r e s s a o )comando
onde expressao e um objeto que representa uma sequencia edeclaracao define uma variavel que sera usada para acessar asequencia
47/48
Instrucao for com base em intervalo II
i n t main ( ){i n t n [ ] = { 4 , 6 , 7 , 9 , 1 } ;v e c to r<i n t> v (n , n+5);
cout << "Mostrando o vetor" ;f o r ( auto i : v )
cout << i ;
r e t u r n 0 ;}
48/48
FIM