¿Cómo manejan las personas el error de profundidad de recursión máxima excedida sin reescribir el código de forma iterativa? (en la programación dinámica de arriba hacia abajo)

A veces esto no se puede evitar. La razón viene en tres partes:

  1. Hay algunos problemas que requieren una gran profundidad de recursión.
  2. En cada uno de los sistemas operativos populares, la configuración predeterminada incluye un límite de tamaño de pila bastante estricto.
  3. Los autores de algunos jueces en línea no tienen la experiencia suficiente para eliminar este límite.

Con respecto al ítem 1, el ejemplo notorio aquí es una búsqueda en profundidad en un gráfico (o cualquiera de sus aplicaciones, por ejemplo, descomposición en componentes biconéctados). Su profundidad de recursión puede ser lineal en la cantidad de vértices, y no hay forma de evitarla. Si su pila no es lo suficientemente grande, debe escribir una versión no recursiva, y eso es todo.

Con respecto al ítem 2, en general esto es algo bueno. El número de casos en que un programador necesita una gran pila es insignificante en comparación con el número de casos en que un programa con errores intenta comer toda la memoria al hacer una llamada recursiva en un ciclo infinito. El límite de tamaño de la pila evita que dicho programa consuma toda la memoria disponible y bloquee el sistema operativo.

Con respecto al artículo 3, esto es algo muy malo. El límite de tamaño de la pila no trae más que molestia a las competiciones algorítmicas; y no es necesario tenerlo, ya que de todos modos existe un límite de memoria global.

Afortunadamente, el límite de tamaño de la pila en las competencias de programación es sobre todo una cosa del pasado. Hoy en día, cualquier organizador de concursos decente ya debe ser consciente de este problema y asegurarse de que se haya eliminado el límite. No conozco ningún concurso de programación importante que aún tenga el límite predeterminado de pila pequeña. Y si alguna vez participas en un concurso que aún contiene esta molestia, ilumina a sus organizadores para que desaparezca go

Asumiré que por programación dinámica recursiva, te refieres a la memorización, por lo que tienes una función con un caché para evitar el recálculo pero estás recurriendo demasiado lejos. La solución es calentar el caché para que no se repita tanto. En lugar de reescribir el algoritmo de forma iterativa, simplemente repita las entradas de menor a mayor llamando a su función para llenar el caché. ahora nunca tendrá una falta de caché y nunca tendrá que recurrir. Esto requiere el mismo tipo de bucle que haría si lo reescribiera recursivamente, pero no tiene que tocar ninguno de los códigos en su función.

La respuesta depende de por qué estás alcanzando el límite de profundidad de recursión. Lo primero que debe preguntarse es si tiene un error en su programa: ¿se está perdiendo un caso base o su recurrencia de alguna manera nunca llega a su caso base?

Si, de hecho, la recursión más allá del límite de profundidad es un comportamiento correcto, otra alternativa es utilizar la recursión de cola (si el compilador la optimiza correctamente). Ver Wikipedia en “llamada de cola”

More Interesting

¿Puede Quantum Computing acelerar las redes neuronales y los algoritmos genéticos?

¿Qué es binario?

¿Qué algoritmos son buenos candidatos para el reconocimiento de sonido? Estoy principalmente interesado en reconocer sonidos en un entorno doméstico, por ejemplo, un temporizador de microondas que suena, un teléfono que suena, un timbre, etc.

Si ASCII es binario a texto, ¿cuál es la relación entre binario a imagen?

¿Cuál es el enfoque de IA para resolver el Cubo de Rubik aleatoriamente barajado?

¿Qué es la programación dinámica?

¿Qué es la búsqueda de fuerza bruta?

Cómo saber si / cuándo puede aplicar la manipulación de bits para resolver un problema

¿Cómo puedo calcular de manera eficiente el número de intercambios requeridos por los métodos de ordenación lenta como la ordenación por inserción y la ordenación por burbujas para ordenar una matriz determinada?

¿Usar un tipo de inserción de 50 elementos tendrá el mismo tiempo de ejecución que usar un tipo de inserción de 10 elementos 5 veces?

¿Qué nivel de matemática se requiere para el libro "Introducción a los algoritmos 3ra edición" (MIT Press)?

¿Es posible aprender automáticamente los diferentes métodos y algoritmos de aprendizaje automático?

Dado un gráfico de N vértices con m1 bordes unidireccionales y m2 bordes bidireccionales, ¿cómo podemos dirigir los bordes bidireccionales de modo que no tengamos ninguna caminata cerrada?

¿Qué son los algoritmos de calibración para aplicaciones biomédicas en teléfonos inteligentes?

¿Cuál es la mejor estructura de datos para almacenar y realizar una adición de dos números grandes de 512 bits?