Un'istruzione return restituisce un valore al chiamante immediato del frame di chiamata della funzione corrente. In caso di ricorsione, questo chiamante immediato può essere un'altra invocazione della stessa funzione.
Nella maggior parte delle lingue, se non si utilizza il valore restituito di una funzione chiamata (ricorsivamente o meno), il valore restituito viene scartato oppure si tratta di un errore diagnosticabile. Esistono alcune lingue in cui il valore di ritorno dell'ultima chiamata di funzione viene riutilizzato automaticamente come valore di ritorno dell'attuale chiamata di funzione, ma non fanno distinzioni tra chiamate di funzione normali e ricorsive.
Supponendo che i valori restituiti inutilizzati vengano scartati silenziosamente, se si fosse scritto il codice in questo modo:
list *search_list(list *l, item_type x) {
if (l == NULL) return(NULL);
if (l->item == x)
return(l);
else
search_list(l->next, x); // no return!
}
search_list
restituirà quindi solo un valore definito per un elenco vuoto (NULL) o se il primo elemento corrisponde al valore che stai cercando. Non appena la funzione passa alla chiamata ricorsiva, non si sa quale sarà il risultato, poiché il risultato della chiamata ricorsiva viene scartato.
Inoltre, prometti di restituire un valore dalla tua funzione, ma hai un percorso (quello ricorsivo) in cui non specifichi quale valore restituire. A seconda della lingua che usi, questo di solito si traduce in una diagnostica obbligatoria o in un comportamento indefinito (che è una scorciatoia per: tutto può succedere e può cambiare in qualsiasi momento senza preavviso. Non ritenere nessuno se non responsabile se si rovina la tua presentazione più importante). Ci sono alcune situazioni in cui il valore di ritorno mancante potrebbe sembrare funzionare, ma ciò potrebbe cambiare alla successiva esecuzione del programma (con o senza ricompilazione).
return
.