O documento discute como a indução e a recursão podem ajudar no desenvolvimento de algoritmos. Primeiramente, explica-se que a prova por indução matemática é, por si só, um algoritmo recursivo. Em seguida, utiliza-se o exemplo do cálculo fatorial para ilustrar como a indução finita pode levar à construção de um algoritmo recursivo, definindo a base, hipótese de indução e passo recursivo.
1. Aula 03 – T´ecnicas de
Desenvolvimento de Algoritmos:
Indu¸c˜ao e Recurs˜ao
Norton Trevisan Roman
norton@usp.br
1 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 1 / 34
2. Indu¸c˜ao e Algoritmos
Vimos que podemos provar que um determinado
problema, definido no conjunto dos n´umeros inteiros
positivos, possui solu¸c˜ao.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 2 / 34
3. Indu¸c˜ao e Algoritmos
Vimos que podemos provar que um determinado
problema, definido no conjunto dos n´umeros inteiros
positivos, possui solu¸c˜ao.
O que ´e mesmo um algoritmo?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 2 / 34
4. Indu¸c˜ao e Algoritmos
Vimos que podemos provar que um determinado
problema, definido no conjunto dos n´umeros inteiros
positivos, possui solu¸c˜ao.
O que ´e mesmo um algoritmo?
Uma sequˆencia de passos a serem efetuados para que se
obtenha uma solu¸c˜ao para um determinado problema
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 2 / 34
5. Indu¸c˜ao e Algoritmos
Vimos que podemos provar que um determinado
problema, definido no conjunto dos n´umeros inteiros
positivos, possui solu¸c˜ao.
O que ´e mesmo um algoritmo?
Uma sequˆencia de passos a serem efetuados para que se
obtenha uma solu¸c˜ao para um determinado problema
Ent˜ao, por extens˜ao, podemos provar que um
determinado algoritmo, cuja entrada sejam n´umeros
inteiros positivos, estar´a correto para todo inteiro
positivo
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 2 / 34
6. Indu¸c˜ao e Algoritmos
De fato, podemos usar a prova por indu¸c˜ao em
qualquer afirma¸c˜ao que contenha uma vari´avel que
possa assumir valores inteiros arbitr´arios e
n˜ao-negativos
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 3 / 34
7. Indu¸c˜ao e Algoritmos
De fato, podemos usar a prova por indu¸c˜ao em
qualquer afirma¸c˜ao que contenha uma vari´avel que
possa assumir valores inteiros arbitr´arios e
n˜ao-negativos
E o ?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 3 / 34
8. Indu¸c˜ao e Algoritmos
De fato, podemos usar a prova por indu¸c˜ao em
qualquer afirma¸c˜ao que contenha uma vari´avel que
possa assumir valores inteiros arbitr´arios e
n˜ao-negativos
E o ?
Precisamos j´a ter o
algoritmo para provar
sua corretude
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 3 / 34
9. Indu¸c˜ao e Algoritmos
De fato, podemos usar a prova por indu¸c˜ao em
qualquer afirma¸c˜ao que contenha uma vari´avel que
possa assumir valores inteiros arbitr´arios e
n˜ao-negativos
E o ?
Precisamos j´a ter o
algoritmo para provar
sua corretude
Ent˜ao como isso me
ajuda a criar o
algoritmo?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 3 / 34
10. Indu¸c˜ao e Algoritmos
Ocorre que a prova matem´atica via indu¸c˜ao finita ´e,
ela pr´opria, um algoritmo recursivo
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 4 / 34
11. Indu¸c˜ao e Algoritmos
Ocorre que a prova matem´atica via indu¸c˜ao finita ´e,
ela pr´opria, um algoritmo recursivo
Algoritmo recursivo?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 4 / 34
12. Indu¸c˜ao e Algoritmos
Ocorre que a prova matem´atica via indu¸c˜ao finita ´e,
ela pr´opria, um algoritmo recursivo
Algoritmo recursivo?
Vejamos o que diz o dicion´ario Fakess para a l´ıngua
portuguesa:
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 4 / 34
13. Indu¸c˜ao e Algoritmos
Ocorre que a prova matem´atica via indu¸c˜ao finita ´e,
ela pr´opria, um algoritmo recursivo
Algoritmo recursivo?
Vejamos o que diz o dicion´ario Fakess para a l´ıngua
portuguesa:
Defini¸c˜ao
Recurs˜ao: Se n˜ao entendeu, vide Recurs˜ao.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 4 / 34
14. Recurs˜ao
Defini¸c˜ao
Um m´etodo ´e chamado de recursivo quando chama a
sim mesmo, direta ou indiretamente.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 5 / 34
15. Recurs˜ao
Defini¸c˜ao
Um m´etodo ´e chamado de recursivo quando chama a
sim mesmo, direta ou indiretamente.
E qual a vantagem disso?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 5 / 34
16. Recurs˜ao
Defini¸c˜ao
Um m´etodo ´e chamado de recursivo quando chama a
sim mesmo, direta ou indiretamente.
E qual a vantagem disso?
Em geral, a recursividade permite uma descri¸c˜ao
mais clara e concisa do algoritmo
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 5 / 34
17. Recurs˜ao
Defini¸c˜ao
Um m´etodo ´e chamado de recursivo quando chama a
sim mesmo, direta ou indiretamente.
E qual a vantagem disso?
Em geral, a recursividade permite uma descri¸c˜ao
mais clara e concisa do algoritmo
M´etodos recursivos baseiam-se no princ´ıpio da
Indu¸c˜ao Finita
S˜ao escolhas naturais para algoritmos definidos assim
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 5 / 34
18. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
19. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
20. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
21. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
22. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Conseguimos ent˜ao calcular o fatorial de n + 1, a partir de
fatorial(n)?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
23. Indu¸c˜ao e Recurs˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Conseguimos ent˜ao calcular o fatorial de n + 1, a partir de
fatorial(n)?
Sim, basta fazer (n+1) * fatorial(n)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
24. Indu¸c˜ao e Recurs˜ao
Base
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Conseguimos ent˜ao calcular o fatorial de n + 1, a partir de
fatorial(n)?
Sim, basta fazer (n+1) * fatorial(n)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
25. Indu¸c˜ao e Recurs˜ao
Hip´otese de
Indu¸c˜ao
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Conseguimos ent˜ao calcular o fatorial de n + 1, a partir de
fatorial(n)?
Sim, basta fazer (n+1) * fatorial(n)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
26. Indu¸c˜ao e Recurs˜ao
Passo
E como isso nos ajuda a construir um algoritmo
com indu¸c˜ao finita?
Tomemos um exemplo: o c´alculo de um fatorial
Sabemos que fatorial(0) = 1
Vamos assumir que temos magicamente um m´etodo que
calcule o fatorial para n: fatorial(n)
Conseguimos ent˜ao calcular o fatorial de n + 1, a partir de
fatorial(n)?
Sim, basta fazer (n+1) * fatorial(n)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 6 / 34
27. Indu¸c˜ao e Recurs˜ao
Ent˜ao...
long fatorial(long n) {
if (n==0) return(1);
return(n * fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 7 / 34
28. Indu¸c˜ao e Recurs˜ao
Ent˜ao...
Base
(fatorial(0) = 1)
long fatorial(long n) {
if (n==0) return(1);
return(n * fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 7 / 34
29. Indu¸c˜ao e Recurs˜ao
Ent˜ao...
Hip´otese de
Indu¸c˜ao
long fatorial(long n) {
if (n==0) return(1);
return(n * fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 7 / 34
30. Indu¸c˜ao e Recurs˜ao
Ent˜ao...
Passo
long fatorial(long n) {
if (n==0) return(1);
return(n * fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 7 / 34
31. Indu¸c˜ao e Recurs˜ao
Ent˜ao...
Hip´otese de
Indu¸c˜ao
long fatorial(long n) {
if (n==0) return(1);
return(n * fatorial(n-1));
}
Note que aqui usamos n − 1 em lugar de n na
hip´otese de indu¸c˜ao. O resultado ´e o mesmo.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 7 / 34
32. Implementa¸c˜ao de Recurs˜ao
E como o compilador implementa a recurs˜ao?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 8 / 34
33. Implementa¸c˜ao de Recurs˜ao
E como o compilador implementa a recurs˜ao?
Por meio da pilha de execu¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 8 / 34
34. Implementa¸c˜ao de Recurs˜ao
E como o compilador implementa a recurs˜ao?
Por meio da pilha de execu¸c˜ao
A cada chamada de m´etodo, s˜ao empilhados
Seus atributos
Suas vari´aveis locais
Seu endere¸co de retorno (a quem chamou o m´etodo)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 8 / 34
35. Implementa¸c˜ao de Recurs˜ao
E como o compilador implementa a recurs˜ao?
Por meio da pilha de execu¸c˜ao
A cada chamada de m´etodo, s˜ao empilhados
Seus atributos
Suas vari´aveis locais
Seu endere¸co de retorno (a quem chamou o m´etodo)
Quando o m´etodo termina, esses dados s˜ao
desempilhados
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 8 / 34
36. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
37. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
Ao chamarmos fatorial(3),
o m´etodo ´e empilhado
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
38. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
39. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
40. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
41. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
42. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
43. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
retorna: ?n: 0
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
44. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
retorna: 1n: 0
´E o caso base!
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
45. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
Desempilha, retornando 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
46. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: 1n: 1
Faz 1 * 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
47. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
Desempilha, retornando 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
48. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: 2n: 2
Faz 2 * 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
49. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
Desempilha, retornando 2
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
50. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: 6n: 3
Faz 3 * 2
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
51. Implementa¸c˜ao de Recurs˜ao
O que acontece ao fazermos
fatorial(3)?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
} Desempilha, retornando 6
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 9 / 34
52. Implementa¸c˜ao de Recurs˜ao
Note que, a cada chamada recursiva, criamos c´opias
distintas do m´etodo na pilha
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
} retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
retorna: ?n: 0
Recurs˜ao pode ser bastante custosa!
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 10 / 34
53. Implementa¸c˜ao de Recurs˜ao
E se esquecermos do
caso base?
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 11 / 34
54. Implementa¸c˜ao de Recurs˜ao
E se esquecermos do
caso base?
long fatorial(long n) {
return(n *
fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 11 / 34
55. Implementa¸c˜ao de Recurs˜ao
E se esquecermos do
caso base?
Ser˜ao feitas chamadas
recursivas, at´e o limite
do segmento de
mem´oria alocado `a
pilha
long fatorial(long n) {
return(n *
fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 11 / 34
56. Implementa¸c˜ao de Recurs˜ao
E se esquecermos do
caso base?
Ser˜ao feitas chamadas
recursivas, at´e o limite
do segmento de
mem´oria alocado `a
pilha
long fatorial(long n) {
return(n *
fatorial(n-1));
}
E teremos ent˜ao um estouro de pilha
Stack overflow
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 11 / 34
57. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
58. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
59. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
60. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
Ao chamarmos m1(), este ´e empilhado
m1
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
61. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
Ao chamarmos m1(), este ´e empilhado
m1
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
62. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
O mesmo ocorre com m2()
m1
m2
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
63. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
O mesmo ocorre com m2()
m1
m2
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
64. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
E m3()
m1
m2
m3
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
65. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
E m3()
m1
m2
m3
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
66. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
Ao terminar, m3() ´e desempilhado
m1
m2
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
67. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
Ao terminar, m3() ´e desempilhado
m1
m2
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
68. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
E m2()
m1
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
69. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
E m2()
m1
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
70. Implementa¸c˜ao de Recurs˜ao
E qual a diferen¸ca entre uma
chamada recursiva e uma comum?
Nenhuma!
Considere o c´odigo ao lado
E finalmente m1()
void m1() {
c1;
m2();
c2;
}
void m2() {
c3;
m3();
c4;
}
void m3() {
c5;
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 12 / 34
71. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo? void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
72. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
73. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Ao chamarmos m1(), este ´e empilhado
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
74. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Ao chamarmos m1(), este ´e empilhado
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
75. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Ao chamarmos m1(), este ´e empilhado
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
76. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Mais uma vez...
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
77. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Mais uma vez...
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
78. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
Mais uma vez...
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
79. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
E mais uma...
m1
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
80. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
At´e que a condi¸c˜ao ser falsa
m1
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
81. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
E um retorne, sendo desempilhado
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
82. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
E um retorne, sendo desempilhado
m1
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
83. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
E outro
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
84. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
E outro
m1
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
85. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
At´e a chamada original
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
86. Implementa¸c˜ao de Recurs˜ao
E se o m´etodo for recursivo?
Ocorre a mesma coisa...
At´e a chamada original
void m1() {
if (condi¸c~ao) {
c1;
m1();
c2;
}
}
S˜ao todas chamadas distintas. A ´unica diferen¸ca ´e
que na recurs˜ao, elas possuem o mesmo nome
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 13 / 34
87. Recurs˜ao e Sequˆencias
Sequˆencias
Uma sequˆencia S ´e uma lista de objetos que s˜ao
enumerados segundo alguma ordem
Existe um primeiro objeto, um segundo etc
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 14 / 34
88. Recurs˜ao e Sequˆencias
Sequˆencias
Uma sequˆencia S ´e uma lista de objetos que s˜ao
enumerados segundo alguma ordem
Existe um primeiro objeto, um segundo etc
Uma sequˆencia ´e definida recursivamente
explicitando-se seu primeiro valor (ou primeiros
valores) e, a partir da´ı, definindo-se outros valores
em termos desses iniciais.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 14 / 34
89. Recurs˜ao e Sequˆencias
Sequˆencias
Uma sequˆencia S ´e uma lista de objetos que s˜ao
enumerados segundo alguma ordem
Existe um primeiro objeto, um segundo etc
Uma sequˆencia ´e definida recursivamente
explicitando-se seu primeiro valor (ou primeiros
valores) e, a partir da´ı, definindo-se outros valores
em termos desses iniciais.
Conjuntos, por outro lado, s˜ao cole¸c˜oes nas quais
nenhuma regra de ordena¸c˜ao ´e imposta
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 14 / 34
90. Recurs˜ao e Sequˆencias
Sequˆencias
Uma sequˆencia S ´e uma lista de objetos que s˜ao
enumerados segundo alguma ordem
Existe um primeiro objeto, um segundo etc
Uma sequˆencia ´e definida recursivamente
explicitando-se seu primeiro valor (ou primeiros
valores) e, a partir da´ı, definindo-se outros valores
em termos desses iniciais.
Conjuntos, por outro lado, s˜ao cole¸c˜oes nas quais
nenhuma regra de ordena¸c˜ao ´e imposta
Alguns conjuntos podem ser definidos recursivamente
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 14 / 34
91. Recurs˜ao × Itera¸c˜ao
Sequˆencias tˆem tanto algoritmos iterativos quanto
recursivos
Ent˜ao algoritmos recursivos, que tratam de sequˆencias,
tˆem sua vers˜ao iterativa
Ex:
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
long fatorial(long n) {
long res = 1;
for (int i=2; i<=n; i++)
res *= i;
return(res);
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 15 / 34
92. Recurs˜ao × Itera¸c˜ao
Sequˆencias tˆem tanto algoritmos iterativos quanto
recursivos
Ent˜ao algoritmos recursivos, que tratam de sequˆencias,
tˆem sua vers˜ao iterativa
Ex:
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
Recursivo
long fatorial(long n) {
long res = 1;
for (int i=2; i<=n; i++)
res *= i;
return(res);
}
Iterativo
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 15 / 34
93. Recurs˜ao × Itera¸c˜ao
Iterativo
int buscaBin(int[] arr, int el){
int fim = arr.length-1;
int ini = 0;
while (ini <= fim) {
int meio = (fim + ini)/2;
if (arr[meio] < el)
ini = meio + 1;
else
if (arr[meio] > el)
fim = meio - 1;
else
return(meio);
}
return(-1);
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 16 / 34
94. Recurs˜ao × Itera¸c˜ao
Iterativo
int buscaBin(int[] arr, int el){
int fim = arr.length-1;
int ini = 0;
while (ini <= fim) {
int meio = (fim + ini)/2;
if (arr[meio] < el)
ini = meio + 1;
else
if (arr[meio] > el)
fim = meio - 1;
else
return(meio);
}
return(-1);
}
Recursivo
int buscaBin(int[] arr, int ini,
int fim, int el){
if (ini > fim) return(-1);
int meio = (fim + ini)/2;
if (arr[meio] < el)
return(buscaBin(arr,meio+1,
fim,el));
if (arr[meio] > el)
return(buscaBin(arr,ini,
meio-1,el));
return(meio);
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 16 / 34
95. Recurs˜ao × Itera¸c˜ao
Solu¸c˜oes recursivas s˜ao geralmente mais concisas
que as iterativas, gerando programas mais simples.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 17 / 34
96. Recurs˜ao × Itera¸c˜ao
Solu¸c˜oes recursivas s˜ao geralmente mais concisas
que as iterativas, gerando programas mais simples.
Solu¸c˜oes recursivas adv´em diretamente da prova por
indu¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 17 / 34
97. Recurs˜ao × Itera¸c˜ao
Solu¸c˜oes recursivas s˜ao geralmente mais concisas
que as iterativas, gerando programas mais simples.
Solu¸c˜oes recursivas adv´em diretamente da prova por
indu¸c˜ao
Solu¸c˜oes iterativas em geral usam uma quantia de
mem´oria limitada, enquanto as recursivas n˜ao
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 17 / 34
98. Recurs˜ao × Itera¸c˜ao
Solu¸c˜oes recursivas s˜ao geralmente mais concisas
que as iterativas, gerando programas mais simples.
Solu¸c˜oes recursivas adv´em diretamente da prova por
indu¸c˜ao
Solu¸c˜oes iterativas em geral usam uma quantia de
mem´oria limitada, enquanto as recursivas n˜ao
A c´opia dos parˆametros a cada chamada recursiva ´e
um custo adicional para as solu¸c˜oes recursivas
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 17 / 34
99. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Dado um arranjo (an, an−1, . . . , a1, a0) de
coeficientes, e um valor x, queremos calcular o
polinˆomio
Pn(x) = anxn
+ an−1xn−1
+ . . . + a1x + a0
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 18 / 34
100. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Dado um arranjo (an, an−1, . . . , a1, a0) de
coeficientes, e um valor x, queremos calcular o
polinˆomio
Pn(x) = anxn
+ an−1xn−1
+ . . . + a1x + a0
Vamos projetar um algoritmo para resolver esse
problema a partir da demonstra¸c˜ao indutiva da
seguinte afirma¸c˜ao:
Dados x e (an, an−1, . . . , a1, a0), posso calcular Pn(x)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 18 / 34
101. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Demonstra¸c˜ao:
Base: P0(x) = a0
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
102. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
103. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Passo: ´E direto que Pn(x) = anxn
+ Pn−1(x)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
104. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Passo: ´E direto que Pn(x) = anxn
+ Pn−1(x)
Algoritmo derivado:
P(A, x, n)
se n = 0 retorne A[0]
sen~ao
retorne A[n] * x^n + P(A, x, n-1)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
105. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Base
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Passo: ´E direto que Pn(x) = anxn
+ Pn−1(x)
Algoritmo derivado:
P(A, x, n)
se n = 0 retorne A[0]
sen~ao
retorne A[n] * x^n + P(A, x, n-1)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
106. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Hip´otese de
Indu¸c˜ao
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Passo: ´E direto que Pn(x) = anxn
+ Pn−1(x)
Algoritmo derivado:
P(A, x, n)
se n = 0 retorne A[0]
sen~ao
retorne A[n] * x^n + P(A, x, n-1)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
107. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Passo
Demonstra¸c˜ao:
Base: P0(x) = a0
Hip´otese: Dados x e (an, an−1, . . . , a1, a0), conseguimos
calcular Pn−1(x)
Passo: ´E direto que Pn(x) = anxn
+ Pn−1(x)
Algoritmo derivado:
P(A, x, n)
se n = 0 retorne A[0]
sen~ao
retorne A[n] * x^n + P(A, x, n-1)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 19 / 34
108. Indu¸c˜ao e Algoritmos
Exemplo: C´alculo de Polinˆomios
Algoritmo:
P(A, x, n)
se n = 0 retorne A[0]
sen~ao
retorne A[n] * x^n + P(A, x, n-1)
E em java:
double pol(double[] A, double x, int n) {
if (n==0) return(A[0]);
return(A[n] * Math.pow(x,n) + pol(A,x,n-1));
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 20 / 34
109. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Vimos o algoritmo “j´a pronto”. Mas ser´a que
conseguimos implement´a-lo a partir da prova?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 21 / 34
110. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Vimos o algoritmo “j´a pronto”. Mas ser´a que
conseguimos implement´a-lo a partir da prova?
Considere a afirma¸c˜ao:
“Dado um arranjo r, ordenado de forma crescente,
de tamanho n ≥ 1, consigo dizer se um determinado
valor x est´a ou n˜ao est´a no arranjo”
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 21 / 34
111. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
112. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
113. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
114. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
115. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j (ind. forte)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
116. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j (ind. forte)
Passo: Seja s um arranjo de j + 1 elementos.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
117. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j (ind. forte)
Passo: Seja s um arranjo de j + 1 elementos.
Se o elemento do meio de s, sm for x, ent˜ao x ∈ s
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
118. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j (ind. forte)
Passo: Seja s um arranjo de j + 1 elementos.
Se o elemento do meio de s, sm for x, ent˜ao x ∈ s
Sen˜ao, se sm > x, olho no sub-arranjo s = [s1, s2, . . . , sm−1].
Pela H.I., sei dizer se x ∈ s , ent˜ao sei dizer se x ∈ s
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
119. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
Base: n = 1. Se r1 = x, ent˜ao x ∈ r, sen˜ao x /∈ r
Hip´otese (H.I.):
Dado j ≥ 1 e um arranjo r de j elementos, em ordem
crescente, sei dizer se x ∈ r, ∀i = |r|, 1 ≤ i ≤ j (ind. forte)
Passo: Seja s um arranjo de j + 1 elementos.
Se o elemento do meio de s, sm for x, ent˜ao x ∈ s
Sen˜ao, se sm > x, olho no sub-arranjo s = [s1, s2, . . . , sm−1].
Pela H.I., sei dizer se x ∈ s , ent˜ao sei dizer se x ∈ s
Sen˜ao (sm < x), olho no sub-arranjo s = [sm+1, sm+2, . . . ,
sj+1]. Pela H.I., sei dizer se x ∈ s , ent˜ao sei dizer se x ∈ s
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 22 / 34
120. Indu¸c˜ao e Algoritmos
Exemplo: Busca Bin´aria
E disso temos o algoritmo:
busca(r, x)
se |r| = 1
se r1=x retorna "est´a"
sen~ao retorna "n~ao est´a"
sen~ao
m <- ´ındice do meio do arranjo
se rm = x, retorna "est´a"
sen~ao, se rm > x
retorna busca([r1, r2, ..., rm−1], x)
sen~ao
retorna busca([rm+1, rm+2, ..., r|r|], x)
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 23 / 34
121. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Considere a imagem
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 24 / 34
122. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Considere a imagem
O objetivo ´e mover os n discos do primeiro pino a
um outro, de acordo com as seguintes regras:
Apenas um disco pode ser movido por vez
Um disco maior n˜ao pode ser colocado sobre um menor
Pode-se usar o terceiro pino como auxiliar
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 24 / 34
123. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Como fazer?
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 25 / 34
124. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Como fazer?
Quero demonstrar que: Dados 3 pinos, e uma torre
de n discos em um desses pinos, consigo mover essa
torre para um segundo pino, sujeito `as condi¸c˜oes:
Apenas um disco pode ser movido por vez
Um disco maior n˜ao pode ser colocado sobre um menor
Pode-se usar o terceiro pino como auxiliar
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 25 / 34
125. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Base: n = 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 26 / 34
126. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Base: n = 1
Mova o disco do pino de origem para o de destino
→
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 26 / 34
127. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Base: n = 1
Mova o disco do pino de origem para o de destino
→
Hip´otese: Consigo mover uma torre de j − 1
discos, (j − 1) ≥ 1 ⇒ j > 1
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 26 / 34
128. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Base: n = 1
Mova o disco do pino de origem para o de destino
→
Hip´otese: Consigo mover uma torre de j − 1
discos, (j − 1) ≥ 1 ⇒ j > 1
Passo: Seja uma torre de Han´oi com j discos:
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 26 / 34
129. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): Pela H.I., consigo mover os j − 1
discos do topo para um pino auxiliar
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 27 / 34
130. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): Pela H.I., consigo mover os j − 1
discos do topo para um pino auxiliar
→
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 27 / 34
131. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): Pela H.I., consigo mover os j − 1
discos do topo para um pino auxiliar
→
Movo ent˜ao o disco da base para o pino de destino
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 27 / 34
132. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): Pela H.I., consigo mover os j − 1
discos do topo para um pino auxiliar
→
Movo ent˜ao o disco da base para o pino de destino
→
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 27 / 34
133. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): E, novamente pela H.I., consigo
mover os j − 1 discos do pino auxiliar para o de
destino
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 28 / 34
134. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Passo (cont.): E, novamente pela H.I., consigo
mover os j − 1 discos do pino auxiliar para o de
destino
→
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 28 / 34
135. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Ou seja...
→ →
→ →
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 29 / 34
136. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
Ou seja...
→ →
→ →
Nada intuitivo!
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 29 / 34
137. Indu¸c˜ao e Algoritmos
Exemplo: Torres de Han´oi
E...
void hanoi(char ori, char dst, char aux, int n) {
if(n == 1) {
System.out.print("Move de " + ori);
System.out.println(" para " + dst);
}
else {
hanoi(ori, aux, dst, n-1);
hanoi(ori, dst, aux, 1);
hanoi(aux, dst, ori, n-1);
}
}
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 30 / 34
138. Indu¸c˜ao e Algoritmos
Torres de Han´oi: resultado
hanoi(’A’,’C’,’B’,3):
Move de A para C
Move de A para B
Move de C para B
Move de A para C
Move de B para A
Move de B para C
Move de A para C
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 31 / 34
139. Em Suma
Algoritmos tratam sempre de se demonstrar um
teorema:
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 32 / 34
140. Em Suma
Algoritmos tratam sempre de se demonstrar um
teorema:
Meu algoritmo resolve um determinado problema
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 32 / 34
141. Em Suma
Algoritmos tratam sempre de se demonstrar um
teorema:
Meu algoritmo resolve um determinado problema
A demonstra¸c˜ao por indu¸c˜ao ´e uma t´ecnica
bastante interessante, pois:
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 32 / 34
142. Em Suma
Algoritmos tratam sempre de se demonstrar um
teorema:
Meu algoritmo resolve um determinado problema
A demonstra¸c˜ao por indu¸c˜ao ´e uma t´ecnica
bastante interessante, pois:
Possui a caracter´ıstica de ser construtiva, evidenciando os
passos necess´arios para se obter o resultado do teorema
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 32 / 34
143. Em Suma
Algoritmos tratam sempre de se demonstrar um
teorema:
Meu algoritmo resolve um determinado problema
A demonstra¸c˜ao por indu¸c˜ao ´e uma t´ecnica
bastante interessante, pois:
Possui a caracter´ıstica de ser construtiva, evidenciando os
passos necess´arios para se obter o resultado do teorema
´Util para formular procedimentos recursivos e indutivos cujas
provas de corretude s˜ao as provas por indu¸c˜ao que lhes
deram origem.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 32 / 34
144. Referˆencias
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Manber, Udi. Introduction to Algorithms: A Creative
Approach. Addison-Wesley. 1989.
Gersting, Judith L. Fundamentos Matem´aticos para a Ciˆencia
da Computa¸c˜ao. 3a ed. LTC. 1993.
Manber, Udi. Using Induction to Design Algorithms.
Communications of the ACM, 31(11). 1988.
Norton Trevisan Romannorton@usp.br Aula 03 – T´ecnicas de Desenvolvimento de Algoritmos: Indu¸c˜ao e Recurs˜ao1 de outubro de 2018 33 / 34