Una declaración de retorno devuelve un valor al llamante inmediato del marco de llamada de la función actual. En el caso de la recursividad, este llamador inmediato puede ser otra invocación de esa misma función.
En la mayoría de los idiomas, si no usa el valor de retorno de una función que llamó (recursivamente o no), ese valor de retorno se descarta o es un error diagnosticable. Hay algunos idiomas en los que el valor de retorno de la última llamada a la función se reutiliza automáticamente como el valor de retorno de la invocación de la función actual, pero no diferencian entre llamadas a funciones normales y recursivas.
Suponiendo que los valores de retorno no utilizados se descarten silenciosamente, si hubiera escrito el código de esta manera:
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!
}
entonces search_listsolo devolvería un valor definido para una lista vacía (NULL) o si el primer elemento coincide con el valor que está buscando. Tan pronto como la función entra en la llamada recursiva, no sabe cuál será el resultado, porque el resultado de la llamada recursiva se descarta.
Además, promete devolver un valor de su función, pero tiene una ruta (la recursiva) donde no especifica qué valor devolver. Dependiendo del idioma que use, esto generalmente resulta en un diagnóstico obligatorio o en un comportamiento indefinido (que es la abreviatura de: cualquier cosa puede suceder y eso puede cambiar en cualquier momento sin previo aviso. No responsabilice a nadie más que a usted mismo si se arruina) tu presentación más importante). Hay algunas situaciones en las que puede parecer que el valor de retorno faltante funciona, pero eso puede cambiar la próxima vez que ejecute el programa (con o sin recompilación).
return.