1 BCC101 – Matemática Discreta Indução / Recursão
1
BCC101 – Matemática Discreta
Indução / Recursão
Recursão
Algumas vezes é difícil definir um objeto ou obter a solução de um problema ou diretamente. Entretanto, pode ser mais fácil definir esse objeto, ou obter a solução do problema, em termos dele próprio.
Por exemplo, a sequência de potências de 2, an = 2n para n≥0 pode também ser definida recursivamente como:
a0 = 1 an+1 = 2 an
Podemos usar recursão para definir sequências, funções, conjuntos etc
BCC101 - Matemática Discreta - DECOM/UFOP 2
Fatorial
Fatorial: n! = 1x2x…x(n-1)xn0!= 1 (inicialização)n!= n · (n -1)! (recursão)
EX: 5!
3
recursão
= 5 · 4! = 5 · 4 · 3! = 5 · 4 · 3 ·
2! = 5 · 4 · 3 · 2 · 1!
= 5 · 4 · 3 · 2 · 1 · 0!
inicialização
= 5 · 4 · 3 · 2 · 1 · 1
Fibonacci
Fibonacci
fib 0 = 0fib 1 = 1fib n = fib (n -1) + fib (n -2)
Esse algoritmo é O(2n ) porque ao passar de n para n-1 efetuamos 2 chamadas recursivas da função, e cada uma usa, por sua vez, duas outras chamadas recursivas, e assim por diante.
4
Coeficientes Binomiais (n,k)
Coeficientes binomiais ocorrem em diversas aplicações: Combinatória/Probabilidade C (n,k) =
número de maneiras de escolher k elementos de um conjunto com n elementos
Algebra: C (n,k) = coeficiente do k esimo termo na expansão binômio de grau n: (x + y )n
5
k
nknC ),(
Notação usada comumente:
Coeficientes Binomiais (n,k)
A maneira mais eficiente de computar todos os C (n,k) até um determinado n é via o triângulo de Pascal.
O triângulo de Pascal é construído colocando 1 no topo (inicialização) e todo elemento seguinte é definido recursivamente como a soma dos números à direita e à esquerda desse número, na linha anterior. Se tal número não existe, é considerado 0.
6
Coeficientes Binomiais (n,k)
11 1
1 2 1 1 3 3 1
1 4 6 4 1 1 5 10 10 5 1
1 6 15 20 15 6 1
7
n = linha0123456
0 k = coluna diagonal 1 2 3
4 5 6Qual é o valor de C
(6,4) ?Qual é a fórmula recursiva para C (n,k) ?
Coeficientes Binomiais (n,k)
Resposta: Use o triângulo de Pascal.Inicialização: O topo do triângulo é 1.
Portanto, C (0,0) = 1. Se falta um número, ele é considerado 0. Isso dá origem a C (n,k) = 0 se k < 0, ou k > n.
Recursão: Cada valor é a soma dos números à direita e à esquerda na linha anterior:
C (n,k) = C (n -1,k-1) + C (n -1,k -1)
8
Coeficientes Binomiais (n,k)
Resumindo:
9
Máximo Divisor Comum - mdc
O algoritmo de Euclides usa o fato: mdc(x,y ) = mdc(y, x mod y)
10
contrário caso
if
),mod,(
0 ,),(
yxymdc
yxyxmdc
supomos aqui que x > 0
Definições Recursivasde Operações Aritméticas
Operações aritméticas podem também ser definidas recursicamente. Por exemplo, se ssabemos com somar 1 podemos definir a adição de qualquer número não negativo:
11
Definições RecursivasSomatório
Definição recursiva de somatório:
12
0 ,
0 ,01
11 naa
n
an
n
ii
n
ii if
if
Definições RecursivasProdutório
13
nn
n
ii aaaaa
121
1
O produtório também pode ser definido de maneira recursiva. Como seria tal definição?
0 ,
0 ,11
11 naa
n
an
n
ii
n
ii if
if
Note que a inicialização é definida de modo que o “produto de nenhum número” é 1.
Definição Recursiva de Conjunto
Alguns conjuntos podem ser definidos recursivamente Começamos com alguns elementos base e definimos os demais elementos recursivamente, usando algumas operações. O conjunto definido é constituído de todos os elementos que podem ser obtidos a partir dos elementos base, usando um número finito de aplicações da recursão.
14
Definição Recursiva de Conjunto
EX: O conjunto S de valores que se pode pagar somente com moedas de 10 e de 25 centavos
Base: 0 é membro de SRecursão: Se x S então
x+10 S e x+25 S
Q: Qual é o conjunto S ?
15
Definição Recursiva de Conjunto
R: S = {0,10,20,25,30,35,40,45,… }Note que os elementos não precisam
ser definidos de modo unívoco. Ex:50 = 0 + 25 + 25
= 0 + 10 + 10 + 10 + 10 + 10
16
Definição Recursiva de Conjunto
Dê uma definição recursiva para o conjunto T dos números negativos e positivos que são potências de 2
T = { …,1/32,1/16,1/8, ¼, ½, 1, 2, 4, 8, 16, …}
Resposta:Base: 1 TRecursão: 2x T e x/2 T se x T
17L16
Exercícios
1. Dê uma definição recursiva para o conjunto potência de S : P (S ).
2. Dê uma definição recursiva para o conjunto de bitstrings bs
3. Dê uma definição recursiva para o conjunto de bitstrigs que são palindromos pal
18L16
Sequências, Listas, Strings
Sequências ou listas são fundamentais em computação. Toda estrutura discreta pode ser descrita como uma sequência de caracteres:
Números decimais : 1010230824879 Números binários : 0111010101010111 Texto. Ex. este documento Programas de computador Padrões da natureza
DNA Proteins
Linguagens de programação19
Sequências, Listas, Strings
Notação:
[a] representa o tipo (ou conjunto) das listas de elementos de um dado tipo a como [a]. Ex:
[2,5,23] :: [Int][‘a’, ‘b’, ‘c’, ’d’] :: [Char][(2,’a’), (9,’d’)] :: [(Int,Char)] [[‘a’, ‘b’], [‘c’], []] :: [[Char]]
20
Sequências, Listas, Strings
DEF: O tipo [a] pode ser definido recursivamente do seguinte modo:
[] :: [a] se x :: a e xs::[a] então (x:xs) :: [a]
Ex:[1,2,3] = 1:[2,3]
= 1:(2:[3]) = 1:(2:(3:[]))
21
Funções sobre listas - Length
A função length :: [a] -> Int computa o comprimento (ou número de elementos) de uma lista
Ex: length [1,6,10,3,9] = 5 length [‘u’,’m’] = 2 length [[‘a’, ‘b’], [‘c’], []] = 3
Q: Defina length recursivamente22
Funções sobre listas - Length
R:Base: length [] = 0Recursão: length (x:xs) = 1 + length(xs)
23
Funções sobre listas – sum e product
sum :: [Int] -> Int computa a soma de todos os valores da lista. Ex: sum [10,7,8] = 25
Q: Defina sum recursivamente
product :: [Int] -> Int computa o produto de todos os valores da lista. product [10,7,8] = 150
Q: Defina product recursivamente
24
Mais exemplos
Defina recursivamente cada uma das seguintes funções: reverse :: [a] -> [a] retorna o reverso da lista dada. Ex:
reverse [10,7,8] = [8,7,10]
maximum :: [Int] -> Int computa o máximo dentre os valores da lista.
maximum [10,7,8] = 10
25
Mais exemplos
concat :: [a] -> [a] -> [a] retorna a lista resultantes de concatenar as 2 listas dadas. Ex: concat [10,7,8] [3,1] = [10,7,8,3,1]
maximum :: [Int] -> Int computa o máximo dentre os valores da lista. maximum [10,7,8] = 10
26
Ordenação
Diversas aplicações em computação requerem ordenação de uma sequência de dados.
Função de ordenação de listas:sort :: [a] -> [a]
Existem diversos métodos para ordenação de listas. Vamos ver a definição recursiva de alguns deles.
27
Ordenação por inserção
insort :: [a] -> [a]insort [] = []insort (x:xs) = insert x (insort xs)
insert :: a -> [a] -> [a]insert y [] = [y]insert y (x:xs) = if y<x then (y:x:xs) else x:(insert y xs)
28
Ordenação por seleção
selsort :: [a] -> [a]selsort [] = []selsort xs = min : selsort ys
where (min,ys) = getmin xs
splitmin :: [a] -> (a,[a])getmin [x] = (x,[])getmin (x:xs) = if x<min then (x,(min:ys)) else (min, (x:ys))
where (min,ys) = getmin xs29
Quicksort
qsort :: [a] -> [a]qsort [] = []qsort (x:xs) = qsort les ++ [x] ++ qsort gts
where les = [y | y <- xs, y < x] gts = [y | y <- xs, y > x]
30