Documente Academic
Documente Profesional
Documente Cultură
1 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
2 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
3 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
4 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
5 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
6 / 44
Recurso
Visto em camisetas: para entender recurso preciso entender recurso. A piada tecnicamente falha!
Denies recursivas em matemtica Provas por induo nita Algoritmos denidos de forma recursiva
7 / 44
Temos ento que os valores de f (n) (n 0) so 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, . . .
8 / 44
k.
9 / 44
Suponha que denimos g (m, n) para m, n 0, com m e n no simultaneamente nulos da seguinte forma: g (m, n) = m se n = 0 g (n, m mod n) se n > 0.
Tabela?
10 / 44
Suponha que denimos g (m, n) para m, n 0, com m e n no simultaneamente nulos da seguinte forma: g (m, n) = m se n = 0 g (n, m mod n) se n > 0.
Tabela?
11 / 44
Tambm conhecemos g (m, n); esta a funo mdc: g (m, n) = mdc(m, n) = (m, n).
12 / 44
Um algoritmo recursivo
13 / 44
Demonstrao.
Provamos isso por induo em n. Se n = 0, isso claro, para qualquer m. Suponha agora que n > 0 e que, para qualquer m 0 gcd(m, k) devolve mdc(m, k) se k < n. Temos que mdc(m, n) = mdc(n, m mod n) [isto exige uma prova, que estamos omitindo]. Por hiptese de induo, o lado direito dessa equao exatamente o que gcd(n, m % n) Portanto, gcd(m, n) devolve mdc(m, n).
14 / 44
Demonstrao.
Provamos isso por induo em n. Se n = 0, isso claro, para qualquer m. Suponha agora que n > 0 e que, para qualquer m 0 gcd(m, k) devolve mdc(m, k) se k < n. Temos que mdc(m, n) = mdc(n, m mod n) [isto exige uma prova, que estamos omitindo]. Por hiptese de induo, o lado direito dessa equao exatamente o que gcd(n, m % n) Portanto, gcd(m, n) devolve mdc(m, n).
15 / 44
16 / 44
17 / 44
18 / 44
19 / 44
20 / 44
21 / 44
22 / 44
23 / 44
A funo de Ackermann
n + 1 se m = 0 A(m, n) = A(m 1, 1) se m > 0 e n = 0 A(m 1, A(m, n 1)) se m > 0 e n > 0. Trivial de programar em C, mas para m 4, impossvel de calcular (A(4, 2) > 1019278 ). Wikipedia e Mathworld so seus amigos aqui.
24 / 44
A funo de Ackermann
n + 1 se m = 0 A(m, n) = A(m 1, 1) se m > 0 e n = 0 A(m 1, A(m, n 1)) se m > 0 e n > 0. Trivial de programar em C, mas para m 4, impossvel de calcular (A(4, 2) > 1019278 ). Wikipedia e Mathworld so seus amigos aqui.
25 / 44
A funo de Ackermann
n + 1 se m = 0 A(m, n) = A(m 1, 1) se m > 0 e n = 0 A(m 1, A(m, n 1)) se m > 0 e n > 0. Trivial de programar em C, mas para m 4, impossvel de calcular (A(4, 2) > 1019278 ). Wikipedia e Mathworld so seus amigos aqui.
26 / 44
Listas ligadas
Um outro jeito de denir as mesmas listas que j vimos: Uma lista ligada : Uma lista vazia ou Uma clula apontando para uma lista ligada.
27 / 44
Listas ligadas
Um outro jeito de denir as mesmas listas que j vimos: Uma lista ligada : Uma lista vazia ou Uma clula apontando para uma lista ligada.
28 / 44
Listas ligadas
Um outro jeito de denir as mesmas listas que j vimos: Uma lista ligada : Uma lista vazia ou Uma clula apontando para uma lista ligada.
29 / 44
Os objetos a serem denidos devem ter um certo tamanho. Mais comum: um inteiro positivo. Um objeto denido em termos de objetos menores. Precisa haver uma base: objetos pequenos para os quais a denio direta.
2 3
30 / 44
Os objetos a serem denidos devem ter um certo tamanho. Mais comum: um inteiro positivo. Um objeto denido em termos de objetos menores. Precisa haver uma base: objetos pequenos para os quais a denio direta.
2 3
31 / 44
Os objetos a serem denidos devem ter um certo tamanho. Mais comum: um inteiro positivo. Um objeto denido em termos de objetos menores. Precisa haver uma base: objetos pequenos para os quais a denio direta.
2 3
32 / 44
Como consertar?
Para entender recurso preciso entender recurso.
Exerccio 1.
Como consertar a frase para ela car matematicamente correta?
Exerccio 2.
Mais importante: como resolver o problema anterior, mantendo a piada?
33 / 44
Como consertar?
Para entender recurso preciso entender recurso.
Exerccio 1.
Como consertar a frase para ela car matematicamente correta?
Exerccio 2.
Mais importante: como resolver o problema anterior, mantendo a piada?
34 / 44
Como consertar?
Para entender recurso preciso entender recurso.
Exerccio 1.
Como consertar a frase para ela car matematicamente correta?
Exerccio 2.
Mais importante: como resolver o problema anterior, mantendo a piada?
35 / 44
Expresso E em notao pr-xa: <natural> E= + F G * F G, onde F e G so expresses em notao pr-xa. (Por simplicidade, ignoramos as operaes -, /, mod.)
36 / 44
Valor val(E) de uma expresso E em <natural> val(E) = val(F) + val(G) val(F) val(G)
37 / 44
38 / 44
A parte recursiva no mistrio: implementa uma denio recursiva. Mas o que acontece com essa parte: int x = 0; while ((a[i] >= 0) && (a[i] <= 9)) x = 10*x + (a[i++]-0); ????? Queremos: se a[r..s] um trecho maximal de dgitos consecutivos, ento x adquire o valor representado por esse trecho.
39 / 44
A parte recursiva no mistrio: implementa uma denio recursiva. Mas o que acontece com essa parte: int x = 0; while ((a[i] >= 0) && (a[i] <= 9)) x = 10*x + (a[i++]-0); ????? Queremos: se a[r..s] um trecho maximal de dgitos consecutivos, ento x adquire o valor representado por esse trecho.
40 / 44
A parte recursiva no mistrio: implementa uma denio recursiva. Mas o que acontece com essa parte: int x = 0; while ((a[i] >= 0) && (a[i] <= 9)) x = 10*x + (a[i++]-0); ????? Queremos: se a[r..s] um trecho maximal de dgitos consecutivos, ento x adquire o valor representado por esse trecho.
41 / 44
A parte recursiva no mistrio: implementa uma denio recursiva. Mas o que acontece com essa parte: int x = 0; while ((a[i] >= 0) && (a[i] <= 9)) x = 10*x + (a[i++]-0); ????? Queremos: se a[r..s] um trecho maximal de dgitos consecutivos, ento x adquire o valor representado por esse trecho.
42 / 44
/* prog5.4.c */ [...] int main(int argc, char *argv[]) { a=argv[1]; printf("%d\n", eval()); return 0; }
43 / 44
Exerccio
Exerccio 3.
Os nmeros de Fibonacci so denidos pela recorrncia Fn = Fn1 + Fn2 , F0 = 0, F1 = 1.
Eles crescem muito rpido e estouram a capacidade de variveis. Escreva um programa que, lendo n, k na linha de comando, imprime o valor fib(n, k) (onde a funo unsigned long fib(unsigned long n, unsigned long k) devolve Fn mod k esse modk para no ter que se preocupar com estouro dos inteiros).
1
Implemente fib como uma funo recursiva (conforme visto em aula). Implemente fib iterativamente, com tempo O(n). Implemente fib com tempo O(log n) (isto requer um tiquinho de matemtica!)
44 / 44
2 3