La ricorsione è una bestia nera nella didattica, e molti giungono alla laurea (e dopo) senza averla mai pienamente compresa. Dunque non vi è da preoccuparsi se all'inizio vi sono difficoltà a comprenderla: essa è controintuitiva e innaturale per la maggior parte dei programmatori, come ho potuto constatare nella mia lunga esperienza di formatore.
In ogni caso, senza caso base non vi sarebbe neppure ricorsione, come in un'automobile senza motore.
Fortunatamente per certuni, la ricorsione ha comunque scenari di utilizzo
estremamente specialistici e limitati nel mondo reale: inoltre, in linguaggi imperativi che non hanno un supporto all'ottimizzazione della tail recursion e usano meccanismi di chiamata C o Pascal basati su stack frame, tra i quali C e Python, l'uso della ricorsione è formalmente sconsigliato, quando non tassativamente proibito (es. MISRA/C e altre normative per l'uso del linguaggio C in sistemi embedded critici).
Dalla MISRA/C 2012:
Rule 17.2 Functions shall not call themselves, either directly or indirectly.
Dunque per la maggioranza dei programmatori mainstream si tratta solo di una tassa scolastica, o poco più.
Ovviamente esistono delle eccezioni alla regola generale, restando al mainstream: e altrettanto ovvialmente la loro natura è tale (alberi e foreste, file systems, funzioni non primitive ricorsive e ben poco altro) da rendere per definizione inutile discuterne con chi sta a malapena iniziando a familiarizzare con le tecniche ricorsive.
Se è vero che la maggior parte degli algoritmi sono descritti in letteratura scientifica in forma ricorsiva, sostanzialmente a cagione della compattezza e dell'economia simbolica che usualmente ne derivano, è altrettanto vero che il suo impiego nella prassi implementativa è decisamente molto più limitato, a causa dei fattori prestazionali sopra richiamati.
loopunrolling ha scritto:
Prendiamo per esempio il fattoriale di 5. Cos'è il fattoriale di 5? il prodotto di tutti i numeri da 5 a 2 estremi compresi.
A rigore, vale la pena di sottolineare che nella definizione anche l'elemento neutro partecipa al prodotto, considerato una e una sola volta (come d'altronde ogni altro suo successore presente, in maniera perfettamente omogenea e coerente). Questo consente, tra l'altro, di evitare una ingiustificata forzatura "per definizione" nel definire il fattoriale dell'unità, lasciando scoperta solo la reale singolarità dello zero fattoriale, che per nostra comodità e per coerenza algebrica si desume per derivazione inversa (ad consequentiam) dover essere pari a uno. In casi come 1! infatti l'appello alla "definizione" non ha alcun reale significato logico e assiomatico, ed è invece la medesima trappola nella quale cadono anche quanti invocano la "definizione" nel caso di zero alla zero, che invece è un normalissimo caso omogeneo se si definiscono i naturali come arietà di insiemi e l'elevamento a esponente naturale a^b come cardinalità del numero di applicazioni tra due insiemi - finiti - di arietà data rispettivamente a e b. Nel caso di due insiemi vuoti, tale cardinalità è ovviamente unitaria, poiché esiste un solo modo per scrivere 0 = 0, ed ecco così elegantemente eliminata una inutile e fastidiosa "per definizione..." che in realtà, se non viene spiegata, appare puramente arbitraria e incomprensibile.
Purtroppo in Italia il generale e fastidioso sbilanciamento nella didattica verso una peculiare mentalità analitica e ancillare alla fisica comporta anche certi timori e sostanziali errori nella logica di definizioni che appartengono a pieno diritto solo al regno della matematica discreta.
In casi come il presente, includere nella definizione l'unità non comporta alcuna "imprecisione" né tampoco evoca paventati scenari di arbitraria proliferazione infinita di elementi neutri nel prodotto, che invece sono sempre possibili in altri scenari e con tipi di definizione analitica: ciascun naturale predecessore del numero dato n, con la sola ovvia eccezione dello zero, viene nella definizione considerato
una e una sola volta nella produttoria, che ciò venga verbalmente esplicitato o meno.
E' invece chiaro che, operativamente e computazionalmente, è del tutto irrilevante effettuare la moltiplicazione per l'unità. Tuttavia, è sempre opportuno chiarire bene le definizioni, visto anche l'andazzo generale della didattica.