Ejemplo de Reescritura de Código
Este ejemplo muestra cómo analizar y optimizar código usando DeepSeek, incluyendo manejo de errores, comentarios y mejoras de rendimiento.
Tarea
Analice y optimice el siguiente código que es ineficiente y carece de manejo de casos límite:
def fib(n):
if n <= 2:
return n
return fib(n-1) + fib(n-2)
Prompt
El código anterior es ineficiente y no maneja casos límite. Por favor, explique los problemas y soluciones, y optimice el código.
Respuesta
Análisis del Problema
Esta implementación de la función Fibonacci fib(n)
utiliza recursión. El código es simple pero tiene los siguientes problemas:
-
Cálculos Redundantes: Las llamadas recursivas resultan en muchos cálculos repetidos. Por ejemplo, al calcular
fib(5)
, los valores defib(3)
yfib(2)
se calculan múltiples veces, reduciendo la eficiencia. -
Manejo Insuficiente de Casos Límite: Mientras que el caso
n <= 2
está manejado, el cason < 0
no se considera. La función devuelve resultados incorrectos para entradas negativas. -
Límite de Profundidad Recursiva: Para valores grandes de
n
, la profundidad de recursión puede exceder el límite estándar de Python y causar unRecursionError
.
Soluciones
-
Usar Memoización: Almacenar números Fibonacci calculados en caché para evitar cálculos redundantes y mejorar la eficiencia.
-
Manejo de Casos Límite: Agregar verificación para
n < 0
y devolver un mensaje de error apropiado o un valor predeterminado. -
Iteración en lugar de Recursión: La recursión es elegante pero ineficiente para conjuntos de datos grandes. Usar un bucle para calcular números Fibonacci y evitar el límite de profundidad recursiva.
Código Optimizado
Método 1: Recursión con Memoización
def fib(n, memo={}):
if n < 0:
raise ValueError("La entrada debe ser un entero no negativo")
if n <= 2:
return 1
if n in memo:
return memo[n]
memo[n] = fib(n-1, memo) + fib(n-2, memo)
return memo[n]
Método 2: Iteración
def fib(n):
if n < 0:
raise ValueError("La entrada debe ser un entero no negativo")
if n <= 2:
return 1
a, b = 1, 1
for _ in range(3, n+1):
a, b = b, a + b
return b
Explicación
-
Recursión con Memoización:
- Usa un diccionario
memo
para almacenar números Fibonacci calculados - Verifica
memo
antes de cada llamada recursiva y devuelve el resultado directamente si está disponible - Lanza un
ValueError
para entradas negativas
- Usa un diccionario
-
Iteración:
- Usa variables
a
yb
para almacenar los dos últimos números Fibonacci - Calcula números Fibonacci en un bucle desde
3
hastan
- También lanza un
ValueError
para entradas negativas
- Usa variables
Resumen
El código optimizado mejora la eficiencia y maneja adecuadamente los casos límite. Tanto la memoización como el método iterativo son técnicas de optimización efectivas, y la elección entre ellas depende de los requisitos específicos y escenarios.
Código para Generar la Respuesta
from openai import OpenAI
client = OpenAI(
base_url="https://api.deepseek.com/",
api_key="<YOUR_API_KEY>"
)
completion = client.chat.completions.create(
model="deepseek-chat",
messages=[
{
"role": "user",
"content": "El código anterior es ineficiente y no maneja casos límite. Por favor, explique los problemas y soluciones, y optimice el código."
}
]
)
print(completion.choices[0].message.content)