Le procedure ricorsive nel Fortran


FORTRANUna procedura ricorsiva, nel Fortran, rappresenta una costruzione artificiosa che ci consente di utilizzare una funzione in se stessa. Analizziamo come nel liguaggio di programmazione Fortran possa essere gestita una procedura di talke tipo; vediamo allora un semplice esempio di funzione ricorsiva alfine di mettere in evidenza appunto il fatto che la funzione richiama se stessa:

RECURSIVE FUNCTION factorial(n) RESULT(res)
INTEGER res, n
IF(n.EQ.1) THEN
   res = 1
ELSE
   res = n*factorial(n-1)
END IF
END

Analizziamo allora nel dettaglio la funzione che presenta una struttura ramificata. La condizione n == 1 è la base della ricorsione. Questo è l’unico modo che si ha per ottenere che il programma smetta di chiamare se stesso.

La parte contenuta nel costrutto else rappresenta la ricorsione. C’è da notare che la chiamata factorial(n-1) avviene all’interno della funzione che sta definendo factorial(n). La parte essenziale di tutto il procedimento di ricorsione è appunto la chiamata a un valore inferiore, n-1, e tale chiamata continuerà fino a quando non si verificherà un valore di n pari a 0.

Possiamo quindi affermare che una procedura di ricorsione che abbia successo chiamerà sempre un valore inferiore.Ci sono molti pericoli connessi all’utilizzo di un algoritmo di ricorsione. Ad esempio così come accade con i cicli while, è possibile per la funzione di chiamare se stessa all’infinito in modo da non fornire mai una risposta.

Un’altro problema che può nascere dal suo utilizzo è legato al fatto che la ricorsione può causare calcoli ridondanti che, anche se possono essere conclusi, possono richiedere molto tempo. Infine  mentre un programma ricorsivo è in esecuzione ha bisogno di spazio in più per accogliere l’overhead della ricorsione.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>