No, non c'è alcun modo per dire un compilatore che è necessaria la ricorsione in coda. Alcuni compilatori (nessuno dei quali sono a conoscenza) potrebbero supportare annotazioni specifiche dell'implementazione, ma questo richiede all'utente di utilizzare quel compilatore specifico. Alcuni altri compilatori, in alcune modalità, non supportano mai intenzionalmente le chiamate tail, perché possono fornire una migliore esperienza di debug non supportando le chiamate tail. L'utente potrebbe utilizzare un compilatore di questo tipo.
La profondità di ricorsione ammesso è altamente programmata, e della funzione dipendente dall'implementazione, e nessun numero sensibili può essere dato per esso. Data una piattaforma specifica, puoi probabilmente determinare la dimensione dello stack di default, investigare le dimensioni del frame per un particolare compilatore su quella piattaforma e fare una semplice divisione per ottenere una stima approssimativa di quante chiamate nidificate puoi avere.
Consiglieresti riscrittura in un modo che rende chiaro al lettore ciò che accade, ma non si basa su un compilatore ottimizzare chiamate coda. Sebbene sia odiato, l'istruzione goto
può essere molto utile per questo.
prendere un semplice coda ricorsiva funzione bit conteggio:
int bitcount(unsigned int n, int acc = 0) {
if (n == 0)
return acc;
return bitcount(n >> 1, acc + (n & 1));
}
Può essere banalmente riscritta come
int bitcount(unsigned int n, int acc = 0) {
tail_recurse:
if (n == 0)
return acc;
// tail return bitcount(n >> 1, acc + (n & 1));
acc += n & 1;
n = n >> 1;
goto tail_recurse;
}
Naturalmente questa è una versione semplice che è banalmente riscritto per evitare ricorsione interamente , e probabilmente dovrebbe nemmeno essere implementato manualmente, ma la trasformazione speciali io ho usato qui è uno che si può applicare a qualsiasi funzione dove la ricorsione in coda è possibile e dove si ha bisogno di ricorsione in coda. Il commento dovrebbe assicurarsi che il lettore possa ancora facilmente individuare cosa sta succedendo.
Quante chiamate di coda ti aspetti all'incirca?Quali compilatori stai prendendo di mira? – Guvante
Se è davvero ricorsivo in coda, e devi sapere con certezza che il compilatore ottimizzerà la ricorsione, dovrebbe essere semplice codificarlo come un loop tu stesso. – jxh
Vedere [questa risposta] (http://stackoverflow.com/a/30090390/315052) per trovare altri motivi per cui una funzione ricorsiva della coda potrebbe non essere ottimizzata. – jxh