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

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

Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas

Apresentações semelhantes


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

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

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) Quadrado de um inteiro (long): long quadradoDe(long const valor) Introdução à Programação 2003/2004

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

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

5 Introdução à Programação
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; Introdução à Programação 2003/2004

6 somaDe(): assinaturas e invocações
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; Introdução à Programação 2003/2004

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; } Introdução à Programação 2003/2004

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

9 Factorial de forma recorrente
n! = ... (n - 1)! ... 4! = 4  3  2  1 = 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 ??????? Introdução à Programação 2003/2004

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

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

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

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

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

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

16 factorialDe(): Traçado
#include <iostream> using namespace std; /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post 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() n: int {frozen} 3 main() Introdução à Programação 2003/2004

17 Introdução à Programação
Pilha Topo da 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 Introdução à Programação 2003/2004

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

19 factorialDe(): Traçado
#include <iostream> using namespace std; /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post 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 Introdução à Programação 2003/2004

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

21 Introdução à Programação
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 Introdução à Programação 2003/2004

22 Introdução à Programação
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 Introdução à Programação 2003/2004


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

Apresentações semelhantes


Anúncios Google