Una declaración de devolución devuelve un valor al llamante inmediato del marco de llamada de la función actual. En el caso de la recursión, este llamante 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 a la que llamó (recursivamente o no), ese valor de retorno se descarta o es un error que se puede diagnosticar. Hay algunos idiomas en los que el valor de retorno de la última llamada de 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 de función normales y recursivas.
Suponiendo que los valores de retorno no utilizados se descartan de forma silenciosa, 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_list
solo 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 sabes cuál será el resultado, porque el resultado de la llamada recursiva se descarta.
Además, prometes devolver un valor desde tu función, pero tienes una ruta (la recursiva) donde no especificas qué valor devolver. Dependiendo del idioma que use, esto generalmente se traduce en un diagnóstico obligatorio o en un comportamiento indefinido (lo cual es abreviado para: cualquier cosa puede suceder y puede cambiar en cualquier momento sin previo aviso. No responsabilice a nadie más que a usted mismo si se equivoca tu presentación más importante). En algunas situaciones, el valor de retorno faltante puede parecer que funciona, pero eso puede cambiar la próxima vez que ejecute el programa (con o sin recompilación).