Você está na página 1de 35

Bibliografia

Matemática Concreta
Fundamentos para
Ciência da Computação
2ª Edição

Ronald L. Graham, Donald E.


Knuth, and Oren Patashnik
(Reading, Massachusetts:
Addison-Wesley, 1994)
Recursão
Aplicações:
•Lingüística
•regras de gramática por Panini Sec. 5 AC
•Chomsky
•Gramática formais
•Parsers de linguagens de programação
•Matemática:
•Lógica:
•Axiomatização
•Aritmética de Peano
•Provas Recursivas
•Computação
•Programação Recursiva
•Em linguagens imperativas
•Em linguagens funcionais
•Estrutura de dados recursivas
•Listas, árvores, grafos
•Complexidade de Algoritmos
•Computabilidade
Recursão

T(n) =
Recursão

T(n) = T(n-1) +
Recursão

T(n) = T(n-1) + 1 +
Recursão

T(n) = T(n-1) + 1 + T(n-1)


Recursão
T(1) = 1
T(n) = 2 T(n-1) + 1

T(1) + 1 = 2
T(n) + 1 = 2 T(n-1) + 2

Seja U(n) = T(n)+1


U(1) = 2
U(n) = 2 U(n-1)

U(n) = 2n T(n) = 2n - 1
Recursão
Nova regra: não pode mover direto entre A e C

A B C

Quantos movimentos para transferir n peças entre do


pino A para o pino C?
Recursão

A B C

T(n) =
Recursão

A B C

T(n) = T(n-1) +
Recursão

A B C

T(n) = T(n-1) + 1 +
Recursão

A B C

T(n) = T(n-1) + 1 + T(n-1) +


Recursão

A B C

T(n) = T(n-1) + 1 + T(n-1) + 1


Recursão

A B C

T(n) = T(n-1) + 1 + T(n-1) + 1 + T(n-1)


Recursão
T(1) = 2
T(n) = 3 T(n-1) + 2

T(1) + 1 = 3
T(n) + 1 = 3 T(n-1) + 3

Seja U(n) = T(n)+1


U(1) = 3
U(n) = 3 U(n-1)

U(n) = 3n T(n) = 3n - 1
Recursão
Em quantas regiões (no máximo), pode-se dividir uma pizza (ou
o plano)com n retas?
L(0)=1
L(1)=2
L(2)=4
L(3)=7
L(4)=11
Recursão
L(0) = 1
L(n) = L(n-1) + n

Substituindo temos:

L(n) = 1 + 1 + 2 + 3 + 4 + ... + n

L(n) = 1 + n (n + 1)/2
Recursão
Em quantas regiões fechadas, pode-se dividir o plano com n
retas?
Recursão
Durante a guerra entre judeus e romanos, 11 rebeldes judeus
foram encurralados em uma caverna. Preferindo se matar a
serem capturados. Decidiram formar um círculo e matar cada
terceira pessoa até não sobrar ninguém. Mas Flavius Josefus não
queria saber do pacto suicida, então calculou rapidamente onde
deveriar ficar.
Recursão
Recursão
Nova regra: eliminamos cada segunda pessoa.
Recursão

1
11 2

10 3

9 4

8 5
7 6
Recursão
Alguma idéia para calcular o problema recursivamente?
Recursão

1
11 2

10 3

9 4

8 5
7 6
Recursão
3
Portanto:
J(2n+1) = 2 J(n) + 1
Isto é:
J(2n+1) =
novoNumero( J(n) ) 11 5
novoNumero(k) = 2k+1

9 7
Recursão
J(1) = 1
J(2n) = 2 J(n) -1, n≥1
J(2n+1) = 2 J(n) + 1 , n≥1

n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

J(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15

Parece que se escrevemos n = 2m+k, onde 2m é a maior potência de 2 não


maior que n, temos:

J(n) = J(2m+k) = 2k +1, o que é fácil provar por indução.


Recursão
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

n 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

J(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15

J(n) 1 1 11 1 11 101 111 1 11 101 111 1001 1011 1101 1111

Uma vez que:

J(n) = J(2m+k) = 2k +1

O processo para obter-se J(n) a partir de n na base 2 consiste em retirar o 1º digito 1


da esquerda (2m) e colocá-lo à direita (1), i.e, J(n) = 2(n – 2m )+1

Portanto J∞(n) = 2m – 1, onde m é o número de bits ligados de n.


Combinatória
2n pessoas estão na fila de um circo, cujo ingresso custa R$5,00.
Sabe-se que n pessoas possuem apenas uma nota de R$5,00 e n
pessoas possuem apenas uma nota de R$10,00. De quantas
maneiras a fila pode ser organizada de forma que a bilheteria
sempre tenha troco?
Combinatória
De quantas formas ao todo as 2n pessoas (sendo n com notas de 5)
podem estar na fila?

2 Dessas, quantas formas não servem?


Combinatória
As formas que não servem são as que tocam a reta y=1 (nessa
interpretação diagonal.

Fazendo um reflexão do lado


esquerdo em relação a reta y=1
chegamos aos caminhos que
partem de (2,0), isto é, que têm
n+1 pessoas com notas de 5 e n-1
com notas de 10 portanto
2
−1

O número de caminhos que servem é portanto:


= - = {Cn} = números de Catalan
Árvores e Número de Catalan
Uma árvore com raiz ordenada é um nó que possui uma lista finita de
árvores ‘filhas’.

Uma árvore binária é vazia ou um nó que possui um par ordenado de


árvores binárias (arv esquerda e arv direita).

Árvores binárias completas com 4 folhas.


Comportamento assintótico
de funções
Sejam g(n): ℤ → ℤ (*). Definimos:

O(g) = { f | ∃c>0,∃n0 ,∀n>n0,f(n)≤cg(n)}


Θ(g) = { f | ∃c1,c2>0,∃n0 ,∀n>n0, c1g(n)≤ f(n)≤c2g(n)}
( )
o(g) = { f| ∀c>0,∃n0 ,∀n>n0,f(n)≤cg(n)} = { f | lim =0}
→ ( )

Ω(g) = { f | g ∈ O(f) }
ω(g) = { f | g ∈ o(f) }
( )
f ∼ g ↔ | lim = 1
→ ( )

(*) Muitas vezes a definição inclui – com adaptações – funções ℝ →ℝ


(ou mesmo ℝ→ℝ)
Quicksort
Na linguagem Haskell o algoritmo quicksort é implementado como:
qsort s = case s of{[]->[];(x:xs)->qsort [y | y<-xs, y<x] ++ x : qsort [y | y<-xs, y>=x]}

A implementação acima escolhe x como pivot, o que não é uma


boa heurística.

Seja qn o número médio de comparações realizadas pelo algoritmo.


Suponto que existem k elementos menores que o Pivot (k = 0..n–1),
existirão n–k –1 elementos maiores que o Pivot, portanto:
=0

1 2
= 1+ + + = 1+ +
Quicksort
2
=1+ + Multiplicando por n

= + +2 Substituindo n por n – 1

−1 = −1 + −1 +2 subtraindo

− −1 =2 +2

=2 + +1
Quicksort
=0

=2 + +1

Substituindo: =2 + 1 ℎ − 2

Obtemos: ℎ =0

1
ℎ = + ℎ

Ou seja {hn} é a série harmônica. Como ℎ = Θ(log n) temos:


= Θ(n log n)

Você também pode gostar