¿Cuáles son todos los diferentes tipos de recursividad en la programación?

La recursión no solo significa “funciones que se llaman a sí mismas”. Significa que algo se define de forma autorreferencial. Hay muchas, muchas variedades. No tengo ninguna esperanza de enumerarlos a todos: alguien está obligado a aparecer y mostrar un buen ejemplo que me perdí. Así que aquí hay una lista de todos los tipos diferentes que se me ocurren:

  • Estructuras de datos recursivas (por ejemplo, árboles, listas enlazadas individualmente)
  • Estructura cíclica de datos
  • Algoritmos recursivos (por ejemplo, el algoritmo de Dijkstra)
  • Consultas recursivas (sí, realmente, ¡las consultas recursivas SQL son una cosa!)
  • Recursividad funcional
  • Recursión mutua (se puede encontrar como variantes de la mayoría de las categorías anteriores)
  • Corecursion
  • Evaluación recursiva: una función como el combinador de punto fijo, cuya evaluación continúa para siempre, devolviendo repetidamente una nueva versión de sí mismo (a menos que la evaluación perezosa proporcione una excusa para detenerse). Esto se puede usar para implementar la recursión anónima.
  • Recursión abierta: la forma dinámica en que los lenguajes orientados a objetos aplican la recursividad en la evaluación de objetos.

La recursión es generalizada en la informática. Es una pena que se enseñe tan poco.

Recursividad funcional

¿Tu pregunta era solo sobre la recursión funcional? Bueno, gran parte de eso está cubierto anteriormente, directa o indirectamente. Dentro del tema limitado de la recursión funcional, hay algunos enfoques diferentes.

  • Estricta recursividad funcional. El enfoque ingenuo, respaldado por el lenguaje de programación más imperativo. Del tipo que corre el riesgo de volar la pila.
  • Recurrencia funcional mediante eliminación de llamadas de cola. Algunos idiomas (p. Ej., Scala) solo pueden lograr esto para las llamadas de cola recursivas individuales. Scheme requiere que todas las implementaciones también hagan esto para la recursividad mutua (y todas las llamadas de cola, de hecho, recursivas o no). Algunos lenguajes (por ejemplo, Haskell) tienen compiladores que también implementan contras de módulo de recursión de cola, lo que hace que algunos tipos de recursividad no recursiva de cola sean seguros.
  • Evaluación perezosa. Haskell, por ejemplo, usa de manera predeterminada la implementación diferida y, como se implementa en el compilador de GHC, solo evalúa la mayor cantidad de funciones necesarias para devolver esa parte del resultado que se requiere actualmente. Si una función recursiva es productiva (es decir, cada iteración produce una parte útil del resultado), la función regresa al final de la primera iteración, con el resto de la recursión aún no evaluado en un thunk. Esto significa que la recursión de cola no es necesaria, porque solo hay un marco de referencia adjunto a la llamada de función. Si la salida se consume de forma recursiva, todo se puede evaluar de manera eficiente en un espacio constante.
  • Pliegues. Esta es una forma de recursión anónima. Los pliegues abstraen los detalles de la recursividad, lo que permite a la persona que llama aplicar una función simple a una estructura de datos recursiva. Debido a que los detalles de implementación están ocultos, los pliegues pueden implementarse de manera segura incluso en lenguajes estrictos como Java o C ++ (donde la implementación real probablemente sea un bucle while). Los pliegues son muy poderosos; Casi todas las funciones que podría aplicar a una estructura de datos recursiva, incluidas todas las estándar que encuentre en la mayoría de las bibliotecas principales, se pueden implementar con pliegues.
  • Trampolines Uso del estilo de paso continuo para implementar la recursividad.

Realmente no. Allí hay algunos atributos para las rutinas recursivas. Por ejemplo, “Recursión de cola” es donde hay una llamada recursiva, la rutina actual es la última instrucción en la rutina recursiva. Un ejemplo típico es el QuickSort donde hay dos llamadas recursivas donde la última es la última instrucción de la rutina. Algunos idiomas pueden aplicar una optimización. La llamada recursiva de cola se convierte en una reasignación de argumentos a variables locales y se utiliza la pila actual de (con dirección de retorno). Esta optimización se encuentra en Scheme lisp y Prolog.

Hay dos tipos de recursión.

  1. Recurrencia de cola : si la última llamada es la llamada de recursión.

Ejemplo:

cola vacía pública (número int) {
if (número == 1) {
regreso;
}más{
System.out.println (número);
}
cola (número -1); // Aquí la llamada de recursión es la última declaración
}

  1. Recursión sin cola : si la llamada de recursión no es la última instrucción.

Ejemplo:

cola vacía pública (número int) {
if (número == 1) {
regreso;
}más{
cola (número -1);
System.out.println (número);
}
}

Varios tipos de recursión se enumeran en ¿Qué es la recursividad?

More Interesting

¿Cómo funciona el ciclo for de este algoritmo?

¿Cuál es el beneficio de resolver un problema de HackerRank.com?

Cómo encontrar un segmento en una matriz con un número máximo de elementos con suma S

¿Es mejor hacer InterviewBit ahora (actualmente estoy en mi quinto semestre) o hacer SPOJ ahora y luego hacer InterviewBit solo 3 o 4 meses antes de las entrevistas? Solo conozco algunas estructuras de datos y algoritmos básicos. He hecho 40 problemas en SPOJ.

¿Debo conocer algoritmos y estructuras de datos si quiero ser un desarrollador de pila completa?

¿Cuál es el tiempo de ejecución para un recorrido en orden?

Dados 2n puntos en un avión. Uno quiere dibujar n segmentos que unan pares de estos puntos, de modo que no haya dos segmentos que compartan un vértice común. ¿De cuántas maneras se puede hacer esto?

¿Cómo funcionan los algoritmos bayesianos para la identificación de spam?

¿Cuáles son los algoritmos más utilizados en los que puedo confiar para mejorar mis habilidades de resolución de problemas?

¿Por qué las matrices tienen una mejor ubicación de caché que la lista vinculada?

Cómo escribir un programa simple usando pseudocódigos

¿Qué hace que Google sea poderoso? ¿Son los datos que tienen o el algoritmo eficiente que desarrollan?

¿Cómo funciona Junglee?

¿Cuál es un buen editorial para Cube Cakes en CodeChef?

¿Cuántas comparaciones se requieren para fusionar 4 archivos ordenados de 35 registros en un solo archivo ordenado?