Ich bin mir nicht sicher, ob COBOL das tut (das hat es auf jeden Fall nicht einmal getan), aber ich kann mir auch nicht vorstellen, dass sich jemand viel für mich interessiert.
Fortran gibt es seit Fortran 90, aber Sie müssen das recursive
Schlüsselwort verwenden, um anzugeben, dass eine Subroutine rekursiv ist.
PL / I war so ziemlich dasselbe - Rekursion wurde unterstützt, aber Sie mussten explizit angeben, welche Prozeduren rekursiv waren.
Ich bezweifle, dass es noch viel mehr gibt. Das Verbot der Rekursion war in den meisten Fällen etwas, was IBM in seinen Sprachentwürfen getan hat, aus dem einfachen Grund, dass IBM-Mainframes (360/370/3090 / ...) keinen Stack in Hardware unterstützen. Wenn die meisten Sprachen von IBM stammen, ist die Rekursion meistens verboten. Jetzt, da sie alle von anderen Orten stammen, ist Rekursion immer erlaubt (obwohl ich hinzufügen sollte, dass einige andere Maschinen, insbesondere die ursprüngliche Cray 1, auch keine Hardware-Unterstützung für einen Stack hatten).
notably the original cray 1
Sie brauchen also keine Rekursion, um Dinosaurier zu klonen? Ich denke, es liegt wirklich an uns Affen, durch die Bäume zu schwingen.Wikipedia sagt:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
quelle
Die OpenCL-Programmiersprache unterstützt keine Rekursion. (siehe Abschnitt 6.8 der OpenCL-Spezifikation )
Die gegenwärtige Motivation dafür ist a) ein Mangel an Platz für tiefe Stapel, b) der Wunsch, statisch die insgesamt erforderlichen Zuweisungen zu kennen, um die Leistung bei Vorhandensein großer Registersätze und umfangreicher Einlagerung zu optimieren.
Dies gilt möglicherweise auch für andere GPU-Programmiersprachen, z. B. Shader-Sprachen.
quelle
Einige c-Compiler für kleine Mikrocontroller unterstützen keine Rekursion, vermutlich weil sie eine extrem begrenzte Stapelgröße haben.
quelle
In den Tagen der Zeilennummern hatte BASIC eine schlechte Rekursionsunterstützung. Viele (alle?) BASICs dieser Zeit unterstützten verschachtelte gosub-Aufrufe, aber nicht die einfache Übergabe von Parametern oder Rückgabewerten in einer Weise, die es nützlich machte, sich selbst aufzurufen.
Viele frühe Computer hatten Probleme mit der Rekursion, weil sie Aufrufanweisungen verwendeten, die die Rücksprungadresse in den Anfang der aufgerufenen Routine schrieben (PDP8, die IAS-Maschinenfamilie, wahrscheinlich mehr Architekturen, mit denen ich nicht vertraut bin), normalerweise so, dass dies der Fall war war der Maschinencode für "Sprung zur Anweisung nach derjenigen, die die Routine aufgerufen hat".
quelle
Es kommt darauf an, was Sie unter " Unterstützung " verstehen . Um die Rekursion zu unterstützen, benötigen Sie einen Stapel, in dem lokale Variablen bei jedem Wiedereintritt erneut instanziiert werden.
Auch wenn die Sprache nicht über das Konzept lokaler Variablen verfügt, können Sie bei jeder Eingabe / Ausgabe einen globalen Index inkrementieren / dekrementieren, wenn sie über das Konzept der "Unterroutine" verfügt und eine Möglichkeit zum Verwalten der Indizierung zwischen identischen Variablen (auch als Array bezeichnet) bietet einer Funktion und greifen dadurch auf ein Mitglied eines oder mehrerer Arrays zu.
Ich weiß nicht, ob dies als "Support" bezeichnet werden kann. Die Fakten sind, dass ich rekursive Funktionen mit dem ZX-Spectrum BASIC geschrieben habe, wie ich es in Fortran77 und in COBOL getan habe ... immer mit diesem Trick.
quelle
Die Assembler-Sprache unterstützt Rekursion nicht direkt - Sie müssen es selbst tun, indem Sie normalerweise Parameter auf den Maschinenstapel übertragen.
quelle
CALL
Anweisung, die die IP-RET
Adresse automatisch auf den Stapel schiebt, bevor zur Unterroutine gesprungen wird, und eine Anweisung, die die Rücksprungadresse in die IP-Adresse einfügt. Es gibt keinen Grund, warum Sie nichtCALL
Ihren eigenen Einstiegspunkt haben können.void f() { f(); }
ist rekursiv.