Instrukcja return przekazuje wartość z powrotem do bezpośredniego wywołującego ramki wywołania bieżącej funkcji. W przypadku rekurencji ten natychmiastowy obiekt wywołujący może być kolejnym wywołaniem tej samej funkcji.
W większości języków, jeśli nie używasz wartości zwracanej przez funkcję, którą wywołałeś (rekurencyjnie lub nie), albo ta wartość zwracana jest odrzucana, albo jest to błąd diagnozowalny. W niektórych językach wartość zwracana z ostatniego wywołania funkcji jest automatycznie ponownie wykorzystywana jako wartość zwracana z bieżącego wywołania funkcji, ale nie rozróżniają normalnych i rekurencyjnych wywołań funkcji.
Zakładając, że nieużywane wartości zwracane są dyskretnie odrzucane, jeśli kod został napisany w ten sposób:
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!
}
wtedy search_list
zwróci tylko zdefiniowaną wartość dla pustej listy (NULL) lub jeśli pierwszy element pasuje do szukanej wartości. Gdy tylko funkcja przejdzie do wywołania rekurencyjnego, nie wiesz, jaki będzie wynik, ponieważ wynik wywołania rekurencyjnego zostanie odrzucony.
Ponadto obiecujesz zwrócić wartość z funkcji, ale masz ścieżkę (rekurencyjną), w której nie określasz, jaką wartość chcesz zwrócić. W zależności od używanego języka zwykle skutkuje to obowiązkową diagnostyką lub nieokreślonym zachowaniem (co jest skrótem: wszystko może się zdarzyć i może się zmienić w dowolnym momencie bez powiadomienia. Nie pociągaj nikogo oprócz siebie do odpowiedzialności, jeśli to popsuje twoja najważniejsza prezentacja). W niektórych sytuacjach może brakować zwracanej wartości, ale może się to zmienić przy następnym uruchomieniu programu (z rekompilacją lub bez).
return
robi ostatni .