1 / 26

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014. Capítulo IX Subprogramação e Recursividade. Programa 9.1: Subprograma bem simples para somar #include < stdio .h> #include <stdlib.h> int soma (int x, int y) {return x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: ");

iain
Download Presentation

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CES-10 INTRODUÇÃO À COMPUTAÇÃOAulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade

  2. Programa 9.1: Subprograma bem simples para somar #include <stdio.h> #include <stdlib.h> int soma (int x, int y) {return x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); c = soma (a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Copiar, salvar e executar

  3. Programa 9.2: Mesmo efeito, porém sem retornar valor #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Copiar, salvar e executar

  4. #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c

  5. #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c Leitura de a e b: 151 346

  6. #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c 151 346 Leitura de a e b: 151 346

  7. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c x y z 151 346 Alocação das variáveis de soma

  8. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c x y z 151 346 Passagem dos argumentos aos parâmetros

  9. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c x y z 151 346 151 346 Passagem dos argumentos aos parâmetros

  10. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c x y z 151 346 151 346 z recebeu o endereço de c z é um ponteiro (apontando para c)

  11. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c x y z c 151 346 151 346 497 O local cujo endereço está em z (*z) recebeo valor de x+y

  12. Função soma #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b x y z c 151 346 151 346 497 Desalocação das variáveis de soma

  13. #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c 151 346 497 Desalocação das variáveis de soma

  14. #include <stdio.h> #include <stdlib.h> void soma (int *z, int x, int y) {*z = x + y;} int main ( ) { int a, b, c; printf ("Digite a e b: "); scanf ("%d%d", &a, &b); soma (&c, a, b); printf ("\nc = a + b = %d + %d = %d", a, b, c); printf ("\n\n"); system ("pause"); return 0; } Função main a b c 151 346 497 Será escrito: c = a + b = 151 + 346 = 497

  15. Programa 9.3: Cálculo recursivo de fatorial Formula recursiva -1, para n < 0 n! = 1, para 0 ≤ n ≤ 1 n * (n-1)!, para n > 1 #include <stdio.h> #include <stdlib.h> #include <conio.h> int fat (int n) { int f; if (n < 0) f = -1; elseif (n <= 1) f = 1; else f = n * fat(n - 1); return f; } int main() { int n; printf ("Calculo de fatorial de n"); printf ("\n\n\tDigite n: "); scanf ("%d", &n); printf ("\n\tFat(%d) = %d", n, fat(n)); printf ("\n\n"); system ("pause"); return 0; } Copiar, salvar e executar

  16. Programa 9.4: Cálculo recursivo instrumentado de fatorial int v = 0; //Numero da versao de fat: global int fat (int n) { int f; int i; v++; printf ("\n"); for (i = 1; i <= v; i++) printf (" "); printf ("Entrada em fatversao %d; n = %d; ", v, n); printf ("Digite algo: "); getche (); printf ("\n"); if (n < 0) f = -1; elseif (n <= 1) f = 1; else f = n * fat(n - 1); printf ("\n"); for (i = 1; i <= v; i++) printf (" "); printf ("Saida de fat versao %d; n = %d; fat = %d; ", v, n, f); printf ("Digite algo: "); getche (); printf ("\n"); v--; if (v == 0) printf ("\n"); return f; } Alterar a função fat do programa anterior Copiar, salvar e executar

  17. 1, para n = 0 An = A * An-1, para n > 0 Exercício 9.1: Potência de expoentes inteiros e não negativos An (n inteiro e não negativo) • Escrever um programa para implementar a seguinte fórmula recursiva: • A função main pode ser parecida com a do programa do fatorial

  18. a, p/ (|a2 - n| < e) RaizQuad (n, a, e) = RaizQuad (n, (a2+n)/(2*a), e), caso contrário Exercício 9.2: Raiz quadrada • Escrever um programa para implementar a seguinte fórmula recursiva: • aé uma aproximação para a raiz quadrada; e é a precisão desejada • A primeira aproximação e a precisão devem ser lidas na função main

  19. -1, p/ n < 0 0, p/ n = 0 Fib (n) = 1, p/ n = 1 Fib (n-2) + Fib (n-1), p/ n > 1 Exercício 9.3: Números de Fibonacci (procriação de coelhos) • Gerar a sequência de números de Fibonacci para um dado valor de n, usando a seguinte fórmula recursiva: • O programa deve montar uma tabela com os números de Fibonacci e com o número de chamadas recursivas para gerar cada um deles • Para tanto, o programa deve ser devidamente instrumentado (ver como exemplo a tabela a seguir)

  20. Exemplo: tabela para n = 20 n | Fib(n) | Chamadas recursivas -------------------------------------------------------- 0 | 0 | 1 1 | 1 | 1 2 | 1 | 3 3 | 2 | 5 4 | 3 | 9 5 | 5 | 15 6 | 8 | 25 7 | 13 | 41 8 | 21 | 67 9 | 34 | 109 10 | 55 | 177 11 | 89 | 287 12 | 144 | 465 13 | 233 | 753 14 | 377 | 1219 15 | 610 | 1973 16 | 987 | 3193 17 | 1597 | 5167 18 | 2584 | 8361 19 | 4181 | 13529 20 | 6765 | 21891

  21. Tarefa 1 do Lab 9: Função binomial • Em Análise Combinatória, o coeficiente binomial tem a seguinte formulação recursiva: • Usando esta formulação, escrever um programa para ler um inteiro positivo m e montar duas matrizes quadradas: • A primeira de nome A(m x m), onde A[i][j] = Binom (i, j), para 0  i  m-1 e 0  j  m-1 • A segunda de nome B(m x m), onde B[i][j] deverá conter o número de chamadas recursivas para calcular A[i][j], para 0  i  m-1 e 0  j  m-1 -1, p/ n < 0, k < 0 ou k >n Binom (n, k) = 1, p/ k = 0 ou k = n Binom (n-1, k-1) + Binom (n-1, k), p/ outros casos

  22. Exemplo: matrizes para m = 8 Matrizes quadradas com valores e chamadas recursivas da funcao binomial Digite a dimensao das matrizes: 8 Matriz A com os valores da funcao binomial: 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 2 1 -1 -1 -1 -1 -1 1 3 3 1 -1 -1 -1 -1 1 4 6 4 1 -1 -1 -1 1 5 10 10 5 1 -1 -1 1 6 15 20 15 6 1 -1 1 7 21 35 35 21 7 1 Matriz B com os numeros de chamadas recursivas da funcao binomial: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 5 5 1 1 1 1 1 1 7 11 7 1 1 1 1 1 9 19 19 9 1 1 1 1 11 29 39 29 11 1 1 1 13 41 69 69 41 13 1 i j i j

  23. Tarefa 2 do Lab 9: Função com aninhamento de recursividade • Uma função h(n) tem a seguinte formulação recursiva aninhada: • Usando esta formulação, escrever um programa para ler um inteiro positivo m e montar uma tabela de h(n) e do número de chamadas recursivas para o cálculo de h(n), para 0  n  m -1, p/ n < 0 0, p/ n = 0 h (n) = n, p/ n > 4 h (2 + h (2*n)), p/ 1 ≤ n ≤ 4

  24. Exemplo: tabela para m = 8 n | h(n) | Chamadas recursivas -------------------------------------------------------- 0 | 0 | 1 1 | 14 | 7 2 | 12 | 5 3 | 8 | 3 4 | 10 | 3 5 | 5 | 1 6 | 6 | 1 7 | 7 | 1 8 | 8 | 1

  25. Tarefa 3 do Lab 9: Função Ackermann • Uma importante função teórica conhecida como função de Ackermann tem a seguinte formulação recursiva: • Usando esta formulação, escrever um programa para ler dois inteiros positivos p e q e montar duas matrizes: • A primeira de nome A(p x q), onde A[i][j] = Acker (i, j), para 0  i  p-1 e 0  j  q-1 • A segunda de nome B(p x q), onde B[i][j] deverá conter o número de chamadas recursivas para calcular A[i][j], para 0  i  p-1 e 0  j  q-1 -1, p/ m < 0 ou n < 0 Acker (m, n) = n+1, p/ m = 0 e n ≥ 0 Acker (m-1, 1) p/ n = 0 e m > 0 Acker (m-1, Acker (m, n-1), p/ outros casos

  26. Exemplo: matrizes para p = 4 e q = 8 Matrizes com valores e chamadas recursivas da funcaoackermann Digite as dimensoes das matrizes: 4 8 Matriz A com os valores da funcaoacker: 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 3 5 7 9 11 13 15 17 5 13 29 61 125 253 509 1021 Matriz B com os numeros de chamadas recursivas da funcaoacker: 1 1 1 1 1 1 1 1 2 4 6 8 10 12 14 16 5 14 27 44 65 90 119 152 15 106 541 2432 10307 42438 172233 693964 i j i j

More Related