2013-02-02 18 views
6

ich über Rekursion studiert, und ich kam in dieser Frage:Welche Eigenschaften muss eine Sprache Rekursion unterstützen?

FORTRAN implementations do not permit recursion because 

a. they use static allocation for variables 

b. they use dynamic allocation for variables 

c. stacks are not available on all machines 

d. it is not possible to implement recursion on all machines. 

ich, dass die Antwort (a)

war herausgefunden Aber ich alle Funktionen wissen wollen, dass eine Programmiersprache haben sollte unterstütze die Rekursion.

Kann bitte jemand meine Zweifel

Vielen Dank im Voraus

+0

Einverstanden, willkommen zu scicomp und danke für die Frage. Um alles zu wiederholen, was Deer Hunter gesagt hat, haben wir viele Fortran-Benutzer in dieser Community, aber im Allgemeinen behandeln wir allgemeine Programmierfragen wie diese nicht. Ich werde dieses zu StackOverflow überführen. –

+0

Ok ich habe es. Danke für den Umzug –

+2

Ich denke, das einzige, was Sie brauchen, sind: Funktionen und lokale Variable und Argument Speicherplatz pro Funktionsaufruf. Zeigen a. In Ihrer Frage scheint zu vermuten, dass der Speicherplatz über Funktionsaufrufe hinweg wiederverwendet wird. – jackrabbit

Antwort

4

Lokale Variablen in einer Funktion oder Unterprogramm (einschließlich der Absenderadresse) lösen sollte eine neue Kopie sein, wenn sie aufgerufen wird.

Normalerweise wird dies mit einer Stack-Architektur gemacht. Immer wenn eine Funktion aufgerufen wird, werden ihre Argumente auf den Stapel geschoben, dann wird ihre Rückkehradresse gedrückt, dann wird auch ein Speicherblock "gedrückt" (indem der Stapelzeiger um einen ausreichenden Betrag dekrementiert wird). Ein spezielles Register, der "frame pointer", wird auf diesen Speicher gerichtet, und die Funktion bezieht sich auf alle ihre lokalen Variablen mit Bezug auf dieses Register.

Andere Sprachen verwenden keinen physischen Hardwarestapel, sondern einen logischen, der als verkettete Liste implementiert ist, aber das Prinzip ist dasselbe.

Da das ursprüngliche Fortrans dieses Konzept nicht hatte und alle Variablen an festen globalen Orten speicherte, würde ein rekursiver Aufruf abstürzen oder hängen. Wenn A zum Beispiel B Anrufe C Anrufe B anruft, dann kehrt B zu C zurück, das zu B zurückkehrt, das ad infinitum zu C zurückkehrt, weil B sich nur an eine Absenderadresse erinnern kann.

calls: A -> B -> C -> B 

returns:  B <- C <- B 
      B -> C 

Was mehr ist, werden alle lokalen Variablen und Argumente der erste Aufruf von B clobbered werden, wenn der zweite Aufruf von B auftritt.

1

Die Multiple-Choice-Frage, nach der der Fragesteller fragt, ist eine irreführende Frage, denn während die ältesten Versionen der Sprache keine Rekursion unterstützen, gibt es moderne Versionen der FORTRAN-Sprache, die eine Rekursion erlauben.

Ob eine Sprachimplementierung die Rekursion unterstützt, sollte als eine Frage der Art und Weise betrachtet werden, in der der Dialekt der Sprache Funktionen definiert, und des Konformitätsgrads der Implementierung.

Verwandte Themen