Colección de citas famosas - Slogan de motivación - Serie de análisis de complejidad temporal y solución eficiente de los números de Fibonacci 3

Serie de análisis de complejidad temporal y solución eficiente de los números de Fibonacci 3

.....Continuó con la última solución efectiva en la segunda serie de Análisis de secuencia de Fibonacci y complejidad temporal.

6.? Solución práctica para la recursividad sin cola

Como se mencionó anteriormente, la complejidad temporal de la solución recursiva típica de la secuencia de Fibonacci es O (1,618 N), que aumenta exponencialmente y no tiene valor práctico.

Si observa detenidamente el proceso de llamada recursiva, encontrará que el proceso recursivo binario de calcular _ Fibonacci _ secuencia (n-1) + calcular _ Fibonacci _ secuencia (n-2) tendrá muchas resultados intermedios repetidos.

Luego, durante el proceso recursivo, los resultados intermedios se guardan en un diccionario y cada llamada recursiva se verifica en el diccionario para ver si es una llamada con los mismos parámetros. Si es así, el resultado se almacena en. el diccionario se devuelve valor directamente.

De esta forma, la complejidad temporal del algoritmo se reduce a O(n). Mediante la tecnología de almacenamiento en caché, la complejidad del tiempo se reduce a un nivel utilizable.

Empiece a escribir este decorador de caché recursivo. Los decoradores se utilizan ampliamente en Python, lo que facilita la cascada modular en muchos casos.

Probemos el efecto y contemos 100 elementos.

La situación de estancamiento original desapareció y los resultados aparecieron al instante.

Bien, calculemos 1200 elementos nuevamente.

Los errores de desbordamiento de pila

también son barreras para la practicidad. El espacio de pila predeterminado de Python no es grande, solo 1000. Python oficialmente no recomienda la recursividad, intente escribirlo como un bucle iterativo. La idea oficial es establecer un pequeño espacio de pila de forma predeterminada. Si un programa tiene una recursividad demasiado profunda, puede exponerse y reescribirse al principio del tiempo de ejecución.

Pero a veces la forma recursiva de escribir es realmente concisa y clara, y aún se puede utilizar cuando no hay requisitos de eficiencia.

Entonces, una forma de resolver el error de desbordamiento durante el proceso recursivo es aumentar dinámicamente el valor límite establecido.

Se podría pensar que usar un decorador es una forma elegante de lograrlo.

Sin embargo, si se considera que el valor inicial de recursionlimit debe restaurarse después de que se ejecute la función recursiva.

El decorador no puede simplemente lograr este objetivo por sí solo (si tiene alguna buena idea, deje un mensaje a continuación para discutirla_)

Logro esta solución pasando el plan de parámetros de función.

Probemos el efecto.

El tiempo de ejecución es el mismo que el ejemplo anterior, con un tiempo total de 0,012642 segundos.

Resolución de problemas

Hacer que la solución recursiva de la secuencia de Fibonacci que no tiene valor práctico se convierta en una solución recursiva utilizable.

Continuará.

Solución eficiente y análisis de complejidad temporal de la secuencia de Fibonacci Parte 4