Una chiamata di funzione ricorsiva della coda consente al compilatore di eseguire un'ottimizzazione speciale che normalmente non può con una ricorsione regolare. In una funzione ricorsiva della coda, la chiamata ricorsiva è l'ultima cosa da eseguire. In questo caso, invece di allocare un frame dello stack per ogni chiamata, il compilatore può rielaborare il codice per riutilizzare semplicemente l'attuale frame dello stack, il che significa che una funzione di registro della coda utilizzerà solo un singolo frame stack rispetto a centinaia o addirittura migliaia.
Questa ottimizzazione è possibile perché il compilatore sa che una volta effettuata la chiamata ricorsiva della coda, non saranno necessarie copie precedenti di variabili, perché non c'è più codice da eseguire. Se, ad esempio, un'istruzione di stampa seguisse una chiamata ricorsiva, il compilatore avrebbe bisogno di conoscere il valore della variabile da stampare dopo il ritorno della chiamata ricorsiva e quindi il frame dello stack non può essere riutilizzato.
Ecco la pagina wiki se desideri maggiori informazioni su come funziona questo "salvamento dello spazio" e stack in realtà, insieme ad esempi: Chiamata di coda
EDIT: non ho spiegato come questo vale per QuickSort, vero? Bene, alcuni termini vengono lanciati in quell'articolo che rendono tutto confuso (e in parte è semplicemente sbagliato). La prima funzione data (QuickSort) fa una chiamata ricorsiva a sinistra, una chiamata ricorsiva a destra e quindi esce. Si noti che la chiamata ricorsiva a destra è l'ultima cosa che accade nella funzione. Se il compilatore supporta l'ottimizzazione ricorsiva della coda (spiegata sopra), solo le chiamate di sinistra creano nuovi fotogrammi di stack; Tutte le chiamate giuste riutilizzano il frame corrente. Questo può salvare alcuni Frame in pila, ma può ancora soffrire del caso in cui il partizionamento crea una sequenza di chiamate in cui l'ottimizzazione della ricorsione della coda non ha importanza. Inoltre, anche se le chiamate sul lato destro usano lo stesso frame, le chiamate sul lato sinistro chiamate entro Le chiamate sul lato destro usano ancora lo stack. Nel peggiore dei casi, la profondità dello stack è N.
La seconda versione descritta è non Un QuickSort ricorsivo coda, ma piuttosto un QuickSort in cui solo l'ordinamento a sinistra viene eseguito in modo ricorsivo e l'ordinamento giusto viene eseguito usando il ciclo. In effetti, questo QuickSort (come precedentemente descritto da un altro utente) non può avere l'ottimizzazione della ricorsione della coda applicata ad esso, perché la chiamata ricorsiva non è l'ultima cosa da eseguire. Come funziona? Se implementata correttamente, la prima chiamata a QuickSort è la stessa di una chiamata sul lato sinistro nell'algoritmo originale. Tuttavia, non vengono chiamate chiamate ricorsive sul lato destro. Come funziona? Bene, il ciclo si occupa di questo: invece di ordinare "a sinistra quindi a destra", ordina la sinistra con una chiamata, quindi ordina la destra ordinando continuamente solo il sinistra della destra. È davvero ridicolo, ma fondamentalmente è solo ordinare così tanti sinistre che i diritti diventano elementi singoli e non devono essere ordinati. Ciò rimuove efficacemente la giusta ricorsione, rendendo la funzione meno ricorsiva (pseudo ricorsivo, se vuoi). Tuttavia, la vera implementazione non sceglie ogni volta solo il lato sinistro; Sceglie il lato più piccolo. L'idea è sempre la stessa; Fondamentalmente fa solo una chiamata ricorsiva da un lato anziché entrambi. Scegliere il lato più corto assicurerà che la profondità dello stack non possa mai essere più grande di Log2 (N), che è la profondità di un albero binario adeguato. Questo perché il lato più corto sarà sempre al massimo delle dimensioni della nostra sezione di array attuale. L'implementazione fornita dall'articolo non garantisce tuttavia, perché può soffrire dello stesso scenario peggiore di "Left is the Whole Tree". Questo articolo in realtà ne dà una buona spiegazione se sei disposto a fare più lettura: Selezione efficiente e smistamento parziale basato su QuickSort