freeCodeCamp/guide/portuguese/computer-science/dynamic-programming/index.md

51 lines
2.0 KiB
Markdown
Raw Normal View History

---
title: Dynamic Programming
localeTitle: Programaçao dinamica
---
## Programaçao dinamica
A Programação Dinâmica (DP) é uma técnica de programação para resolver problemas onde os cálculos de seus subproblemas se sobrepõem: você escreve seu programa de uma maneira que evita recomputar problemas já solucionados. Essa técnica, geralmente, é aplicada em conjunto com o memoization, que é uma técnica de otimização em que você armazena em cache resultados previamente calculados e retorna o resultado em cache quando o mesmo cálculo é necessário novamente.
Um exemplo com a série de Fibonacci que é definida como:
`F(N) = F(N-1) + F(N-2)`
Esta é a árvore para encontrar F (5):
![Árvore da série de Fibonacci](https://i.stack.imgur.com/59Rpw.png)
Para calcular F (5), será necessário calcular muitas vezes o mesmo F (i). Usando recursão:
```python
def fib(n)
{
if n <= 1:
return n
return fib(n-1) + fib(n-2);
}
```
E abaixo está a solução otimizada (usando DP)
Para F (5), esta solução irá gerar as chamadas representadas na imagem acima, rodando em O (2 ^ N).
Aqui está uma solução otimizada que usa DP e memoização:
```python
lookup = {1 : 1, 2 : 1} # Create a lookup-table (a map) inizialized with the first 2 Fibonacci's numbers
def fib(n)
{
if n in lookup: # If n is already computed
return n # Return the previous computed solution
else
lookup[n] = fib(n-1) + fib(n-2) # Else, do the recursion.
return lookup[n]
}
```
Armazenar em cache as soluções computadas em uma tabela de consulta e consultá-la antes da recursão permitirá que o programa tenha um tempo de execução de O (N).
#### Mais Informações:
[O que é programação dinâmica no StackOverflow?](https://stackoverflow.com/questions/1065433/what-is-dynamic-programming) [Diferença entre memoization e DP no StackOverflow](https://stackoverflow.com/questions/6184869/what-is-the-difference-between-memoization-and-dynamic-programming)