A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Aula 5 Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas.

Apresentações semelhantes


Apresentação em tema: "Aula 5 Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas."— Transcrição da apresentação:

1 Aula 5 Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas

2 2003/2004 Introdução à Programação 2 Sobrecarga de nomes de rotinas Quadrado de um inteiro ( int ): int quadradoDe(int const valor) { return valor * valor; } Quadrado de um valor de vírgula flutuante ( double ): double quadradoDe(double const valor) { return valor * valor; } Quadrado de um inteiro ( long ): long quadradoDe(long const valor) { return valor * valor; }

3 2003/2004 Introdução à Programação 3 Assinatura de uma rotina Assinatura de uma rotina: Nome Lista dos tipos dos parâmetros Não pode existir mais do que uma rotina com a mesma assinatura

4 2003/2004 Introdução à Programação 4 quadradoDe() : assinaturas e invocações Assinaturas quadradoDe, int quadradoDe, double quadradoDe, long Invocações cout << quadradoDe(10) << endl; // int cout << quadradoDe(10.0) << endl; // double cout << quadradoDe(10L) << endl; // long

5 2003/2004 Introdução à Programação 5 somaDe() int somaDe() { return 0; } int somaDe(int const a) { return a; } int somaDe(int const a, int const b) { return a + b; } int somaDe(int const a, int const b, int const c) { return a + b + c; }

6 2003/2004 Introdução à Programação 6 somaDe() : assinaturas e invocações Assinaturas: somaDe somaDe, int somaDe, int, int somaDe, int, int, int Invocações: cout << somaDe() << endl; cout << somaDe(1) << endl; cout << somaDe(1, 2) << endl; cout << somaDe(3, 2, 1) << endl;

7 2003/2004 Introdução à Programação 7 somaDe() : parâmetros com argumentos por omissão int somaDe(int const a = 0, int const b = 0, int const c = 0) { return a + b + c; }

8 2003/2004 Introdução à Programação 8 Factorial n! = n n se 0 < n n! = 1 se n = 0 n! = n! = (P i : 1 i n : i ) n i i = 1

9 2003/2004 Introdução à Programação 9 Factorial de forma recorrente n! =... (n - 1)!... 4! = = 4 (3 2 1) 4! = 4 3! n! = n (n - 1)! Esta definição é válida sempre? E se n for 0? 0! = 0 (-1)! = 0 ???????

10 2003/2004 Introdução à Programação 10 Definição do factorial Matematicamente de forma recorrente n! = n (n - 1)! se 0 < n n! = 1 se n = 0 Em C++ ? factorialDe( ? ) { ? }

11 2003/2004 Introdução à Programação 11 factorialDe() /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n !. */ ? factorialDe( ? ) { assert( ? ); ? }

12 2003/2004 Introdução à Programação 12 factorialDe() /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n !. */ int factorialDe(int const n) { assert(0 <= n); ? }

13 2003/2004 Introdução à Programação 13 factorialDe() /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n !. */ int factorialDe(int const n) { assert(0 <= n); if(n == 0) return 1; else return ? ; }

14 2003/2004 Introdução à Programação 14 factorialDe() /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n !. */ int factorialDe(int const n) { assert(0 <= n); if(n == 0) return 1; else return n * factorialDe(n - 1); }

15 2003/2004 Introdução à Programação 15 Recursividade Rotina recursiva Corpo invoca a própria rotina Corpo invoca rotinas que invocam a rotina

16 2003/2004 Introdução à Programação 16 factorialDe() : Traçado #include using namespace std; /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n!. */ int factorialDe(int const n) { assert(0 <= n); if(n == 0) return 1; else return n * factorialDe(n - 1); } int main() { cout << factorialDe(3) << endl; } factorialDe() main() n : int {frozen} 3

17 2003/2004 Introdução à Programação 17 Pilha Estrutura onde se acumulam coisas de baixo para cima Acesso directo ao topo Computador usa pilha para arrumar a casa durante invocação de rotinas Topo da pilha

18 2003/2004 Introdução à Programação 18 a : int 1 b : int 2 : int 3 somaDe() : Traçado #include using namespace std; int somaDe(int const a, int const b) { return a + b; } int main() { soma(1, 2) cout << << endl; }

19 2003/2004 Introdução à Programação 19 factorialDe() : Traçado #include using namespace std; /** Devolve o factorial do inteiro não negativo passado como 0 factorialDe = n!. */ int factorialDe(int const n) { assert(0 <= n); if(n == 0 or n == 1) // 1 return 1; // 2 else factorialDe(n – 1) // 3A return n * ; // 3B } int main() { factorialDe(3) // 4A cout << << endl; // 4B }

20 2003/2004 Introdução à Programação 20 retorno a 4B n : int 3 retorno a 3B n : int 1 retorno a 3B Traçado Topo da pilha retorno a 4B n : int 3 retorno a 4B n : int retorno a 3B retorno a 4B n : int 3 retorno a 4B n : int 3 2 : int Valor devolvido O mesmo que {frozen}

21 2003/2004 Introdução à Programação 21 A reter… Pilha Estrutura organizada de baixo para cima Acesso directo ao topo Computador usa pilha para arrumar a casa durante invocação de rotinas Pilha termina sempre como começou Recursividade introduz ineficiências Trabalhos de arrumação da casa usando pilha Memória usada Velocidade de execução

22 2003/2004 Introdução à Programação 22 Aula 5: Sumário Sobrecarga de nomes de rotinas: Noção de assinatura Utilizações Rotinas recursivas: Problemas Garantia de terminação Aplicações Mecanismo de invocação de rotinas: Pilha Instâncias locais, parâmetros e valor devolvido Porque, e como, funcionam as rotinas recursivas


Carregar ppt "Aula 5 Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas."

Apresentações semelhantes


Anúncios Google