2013-02-02 15 views
6

stavo studiando sulla ricorsione e mi sono imbattuto in questa domanda:Quali proprietà deve avere una lingua per supportare la ricorsione?

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. 

ho scoperto che la risposta è stata (a)

Ma voglio sapere tutte le caratteristiche che un linguaggio di programmazione dovrebbe avere per supporta la ricorsione.

Può qualcuno si prega di risolvere il mio dubbio

Grazie in anticipo

+0

Concordato, benvenuto a scicomp e grazie per la domanda. Solo per fare eco a tutto ciò che ha detto Deer Hunter, abbiamo un sacco di utenti Fortran in questa comunità, ma generalmente non gestiamo domande di programmazione generale come questa. Ho intenzione di spostare questo su StackOverflow. –

+0

Ok ho capito. Grazie per il passaggio –

+2

Immagino che l'unica cosa di cui hai bisogno sono: funzioni e spazio di memoria locale e argomento per invocazione di funzione. Punto a. nella tua domanda sembra suggerire che lo spazio di archiviazione sia riutilizzato attraverso le chiamate di funzioni. – jackrabbit

risposta

4

variabili locali in una funzione o una subroutine (compreso il suo indirizzo di ritorno) dovrebbe essere una nuova copia ogni volta che viene chiamato.

Di solito questo viene fatto utilizzando un'architettura stack. Ogni volta che viene chiamata una funzione, i suoi argomenti vengono inseriti nello stack, quindi viene inviato il suo indirizzo di ritorno, quindi viene anche "spinto" un blocco di memoria (diminuendo il puntatore dello stack di una quantità sufficiente). Un registro speciale, il "puntatore del frame" viene impostato puntando a quella memoria e la funzione fa riferimento a tutte le sue variabili locali facendo riferimento a quel registro.

Altri linguaggi non utilizzano uno stack hardware fisico, ma uno logico implementato come elenco collegato, ma il principio è lo stesso.

Poiché i Fortrans originali non disponevano di questo concetto e memorizzavano tutte le variabili in posizioni globali fisse, una chiamata ricorsiva si bloccava o si bloccava. Ad esempio, se A chiama B chiama C chiama B, quindi B ritorna a C, che ritorna a B, che ritorna a C, all'infinito, perché B può ricordare solo un indirizzo di ritorno.

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

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

Cosa c'è di più, tutte le variabili e gli argomenti della prima chiamata a B locali sono rovinati quando si verifica la seconda chiamata a B.

1

La domanda a scelta multipla che l'interrogante chiede è una domanda fuorviante, perché mentre le versioni più vecchie della lingua mancano di supporto alla ricorsione, ci sono versioni moderne del linguaggio FORTRAN che DO consente la ricorsione.

Se l'implementazione di un linguaggio supporta la ricorsione dovrebbe essere considerata una questione del modo in cui il dialetto del linguaggio definisce le funzioni e del grado di conformità dell'implementazione.

Problemi correlati