48
1/48 BCC 201 - Introdu¸ ao ` a Programa¸ ao I Recursividade Guillermo C´ amara-Ch´ avez UFOP

BCC 201 - Introdução à Programação I Recursividade

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: BCC 201 - Introdução à Programação I Recursividade

1/48

BCC 201 - Introducao a Programacao I

Recursividade

Guillermo Camara-ChavezUFOP

Page 2: BCC 201 - Introdução à Programação I Recursividade

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

Page 3: BCC 201 - Introdução à Programação I Recursividade

3/48

Introducao II

Uma forma visual de recursividade conhecida como efeitoDroste

Page 4: BCC 201 - Introdução à Programação I Recursividade

4/48

Introducao III

Page 5: BCC 201 - Introdução à Programação I Recursividade

5/48

Introducao IV

I Recursao matematicaI Como definir recursivamente a seguinte soma?

n∑k=m

k = m + (m + 1) + . . . + (n − 1) + n

Page 6: BCC 201 - Introdução à Programação I Recursividade

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

Page 7: BCC 201 - Introdução à Programação I Recursividade

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

Page 8: BCC 201 - Introdução à Programação I Recursividade

8/48

Pilha de execucao I

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 9: BCC 201 - Introdução à Programação I Recursividade

9/48

Pilha de execucao II

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 10: BCC 201 - Introdução à Programação I Recursividade

10/48

Pilha de execucao III

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 11: BCC 201 - Introdução à Programação I Recursividade

11/48

Pilha de execucao IV

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 12: BCC 201 - Introdução à Programação I Recursividade

12/48

Pilha de execucao V

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 13: BCC 201 - Introdução à Programação I Recursividade

13/48

Pilha de execucao VI

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 14: BCC 201 - Introdução à Programação I Recursividade

14/48

Pilha de execucao VII

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 15: BCC 201 - Introdução à Programação I Recursividade

15/48

Pilha de execucao VIII

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 16: BCC 201 - Introdução à Programação I Recursividade

16/48

Pilha de execucao IX

A cada chamada de funcao o sistema reserva espaco paraparametros, variaveis locais e valor de retorno.

Page 17: BCC 201 - Introdução à Programação I Recursividade

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

Page 18: BCC 201 - Introdução à Programação I Recursividade

18/48

Fatorial I

n! =

{1 se n = 0

n ∗ (n − 1)! se n > 0

Page 19: BCC 201 - Introdução à Programação I Recursividade

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);}

Page 20: BCC 201 - Introdução à Programação I Recursividade

20/48

Potencia I

xn =

{1 se n = 0

x ∗ xn−1 se n > 0

Page 21: BCC 201 - Introdução à Programação I Recursividade

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);

}

Page 22: BCC 201 - Introdução à Programação I Recursividade

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

Page 23: BCC 201 - Introdução à Programação I Recursividade

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 ) ;

}

Page 24: BCC 201 - Introdução à Programação I Recursividade

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.

Page 25: BCC 201 - Introdução à Programação I Recursividade

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 ;

}

Page 26: BCC 201 - Introdução à Programação I Recursividade

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 ) ;

}

Page 27: BCC 201 - Introdução à Programação I Recursividade

27/48

Exemplos VI

Encontrar a soma dos elementos de um vetor

Page 28: BCC 201 - Introdução à Programação I Recursividade

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);

}

Page 29: BCC 201 - Introdução à Programação I Recursividade

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

Page 30: BCC 201 - Introdução à Programação I Recursividade

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

Page 31: BCC 201 - Introdução à Programação I Recursividade

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

Page 32: BCC 201 - Introdução à Programação I Recursividade

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

Page 33: BCC 201 - Introdução à Programação I Recursividade

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

Page 34: BCC 201 - Introdução à Programação I Recursividade

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

Page 35: BCC 201 - Introdução à Programação I Recursividade

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

Page 36: BCC 201 - Introdução à Programação I Recursividade

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 ;

}

Page 37: BCC 201 - Introdução à Programação I Recursividade

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

Page 38: BCC 201 - Introdução à Programação I Recursividade

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);

Page 39: BCC 201 - Introdução à Programação I Recursividade

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 ) ;

Page 40: BCC 201 - Introdução à Programação I Recursividade

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 ;

}

Page 41: BCC 201 - Introdução à Programação I Recursividade

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 ;

}

Page 42: BCC 201 - Introdução à Programação I Recursividade

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 ;}

Page 43: BCC 201 - Introdução à Programação I Recursividade

43/48

Iteradores I

Page 44: BCC 201 - Introdução à Programação I Recursividade

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

Page 45: BCC 201 - Introdução à Programação I Recursividade

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 ;}

Page 46: BCC 201 - Introdução à Programação I Recursividade

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

Page 47: BCC 201 - Introdução à Programação I Recursividade

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 ;}

Page 48: BCC 201 - Introdução à Programação I Recursividade

48/48

FIM