No estoy seguro de que COBOL lo haga (ciertamente no lo hizo alguna vez), pero tampoco puedo imaginar que a nadie le importe mucho.
Fortran tiene desde Fortran 90, pero requiere que use la recursive
palabra clave para decirle que una subrutina es recursiva.
PL / I era más o menos lo mismo: la recursión era compatible, pero había que decirle explícitamente qué procedimientos eran recursivos.
Sin embargo, dudo que haya muchos más que eso. Cuando llega el momento, la prohibición de la recursión fue principalmente algo que IBM hizo en sus diseños de lenguaje, por la sencilla razón de que los mainframes IBM (360/370/3090 / ...) no admiten una pila en el hardware. Cuando la mayoría de los idiomas provenían de IBM, en su mayoría prohibían la recursividad. Ahora que todos provienen de otros lugares, la recursión siempre está permitida (aunque debo agregar que algunas otras máquinas, especialmente la Cray 1 original, tampoco tenían soporte de hardware para una pila).
notably the original cray 1
Entonces, ¿no necesitas recurrencia para clonar dinosaurios? Supongo que realmente depende de nosotros los monos balancearse entre los árboles.Wikipedia dice:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
fuente
El lenguaje de programación OpenCL no admite recursividad. (ver sección 6.8 de la especificación OpenCL )
La motivación actual para eso es a) la falta de espacio para las pilas profundas b) el deseo de conocer, estáticamente, las asignaciones totales requeridas para optimizar el rendimiento en presencia de grandes conjuntos de registros y una amplia alineación.
Esto puede aplicarse a otros lenguajes de programación de GPU, por ejemplo, lenguajes de sombreado.
fuente
Algunos compiladores de c para microcontroladores pequeños no admiten recursividad, presumiblemente porque tienen un tamaño de pila extremadamente limitado.
fuente
BASIC, en los días de números de línea, tendía a tener un pobre soporte de recursividad. Muchos (¿todos?) BÁSICOS de esa época admitían llamadas gosub anidadas, pero no admitían una manera fácil de pasar parámetros o devolver valores de una manera que fuera útil para la auto-llamada.
Muchas de las primeras computadoras tenían problemas con la recursividad, porque usaban instrucciones de llamada que escribían la dirección del remitente al comienzo de la rutina llamada (PDP8, la familia de máquinas IAS, probablemente más arquitecturas con las que no estoy familiarizado), generalmente de tal manera que era el código de máquina para "Saltar a la instrucción después de la que llamó a la rutina".
fuente
Depende de lo que quieras decir con " soporte ". Para admitir la recursión, necesita una pila donde volver a instanciar las variables locales en cada reingreso.
Incluso si el lenguaje no tiene el concepto de variables locales, si tiene el concepto de "subrutina" y tiene una forma de gestionar una indexación entre variables idénticas (también conocido como matriz), puede aumentar / disminuir un índice global en cada entrada / salida de una función y acceder a través de ella a un miembro de una o más matrices.
No sé si esto se puede llamar "soporte". Los hechos son que escribí una función recursiva con ZX-Spectrum BASIC, como lo hice en Fortran77 como en COBOL ... siempre con ese truco.
fuente
El lenguaje ensamblador no admite directamente la recursividad: debe "hacerlo usted mismo", generalmente introduciendo parámetros en la pila de máquinas.
fuente
CALL
instrucción, que empuja automáticamente la IP a la pila antes de saltar a la subrutina, y unasRET
instrucciones que introducen la dirección de retorno en la IP. No hay razón para que no puedas tenerCALL
tu propio punto de entrada.void f() { f(); }
es recursivo