Python - Memoización
# 5 Ejemplos de memoización en Python:
#1. Secuencia de Fibonacci usando memoización:
def fibonacci(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 2:
        return 1
    memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
    return memo[n]
#2. Factorial usando memoización:
def factorial(n, memo={}):
    if n in memo:
        return memo[n]
    if n == 0:
        return 1
    memo[n] = n * factorial(n-1, memo)
    return memo[n]
#3. Calcula la n-ésima potencia de un número usando memoización:
def power(x, n, memo={}):
    if n == 0:
        return 1
    if n % 2 == 0:
        if n not in memo:
            memo[n] = power(x, n/2, memo)
        return memo[n] * memo[n]
    else:
        if (n-1) not in memo:
            memo[n-1] = power(x, (n-1)/2, memo)
        return x * memo[n-1] * memo[n-1]
#4. Subsecuencia común más larga usando memoización:
def lcs(s1, s2, memo={}):
    if (s1, s2) in memo:
        return memo[(s1, s2)]
    if not s1 or not s2:
        return ""
    if s1[0] == s2[0]:
        memo[(s1, s2)] = s1[0] + lcs(s1[1:], s2[1:], memo)
    else:
        memo[(s1, s2)] = max(lcs(s1[1:], s2, memo), lcs(s1, s2[1:], memo), key=len)
    return memo[(s1, s2)]
#5. Problema de mochila usando memoización:
def knapsack(capacity, weights, values, n, memo={}):
    if (capacity, n) in memo:
        return memo[(capacity, n)]
    if n == 0 or capacity == 0:
        return 0
    if weights[n-1] > capacity:
        memo[(capacity, n)] = knapsack(capacity, weights, values, n-1, memo)
        return memo[(capacity, n)]
    memo[(capacity, n)] = max(values[n-1] + knapsack(capacity-weights[n-1], weights, values, n-1, memo), knapsack(capacity, weights, values, n-1, memo))
    return memo[(capacity, n)]