260 likes | 411 Views
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: ");
E N D
CES-10 INTRODUÇÃO À COMPUTAÇÃOAulas 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: "); 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
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
#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
#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
#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
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
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
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
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)
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
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
#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
#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
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
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
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
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
-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)
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
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
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
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
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
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
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