J'avais juste un doute dans ma tête. Le sous-programme suivant (pour rechercher un élément, dans une liste, par exemple) a une instruction return à la fin:
list *search_list(list *l, item_type x) {
if (l == NULL) return(NULL);
if (l->item == x)
return(l);
else
return( search_list(l->next, x) );
}
Je ne peux pas obtenir la signification de l'instruction de retour à la fin (c'est-à-dire retourner la liste de recherche (l-> suivant, x)). Il serait vraiment utile que quelqu'un puisse expliquer ce concept en utilisant un modèle de pile.
return
.return
. En fait, dans les langages fonctionnels (et certains mixtes, comme Scala)return
n'est pas nécessaire : la valeur de la fonction récursive est la valeur de sa dernière expression. Écrire simplementsearch_list(l->next, x)
sansreturn
aurait fonctionné à Scala! La signification de lareturn
déclaration n'est évidente que pour les programmeurs ayant une formation impérative.Réponses:
Une instruction return renvoie une valeur à l' appelant immédiat de la trame d' appel de la fonction actuelle. En cas de récursivité, cet appelant immédiat peut être une autre invocation de cette même fonction.
Dans la plupart des langues, si vous n'utilisez pas la valeur de retour d'une fonction que vous avez appelée (récursivement ou non), cette valeur de retour est supprimée ou il s'agit d'une erreur diagnostiquable. Dans certains langages, la valeur de retour du dernier appel de fonction est automatiquement réutilisée en tant que valeur de retour de l'appel de fonction en cours, mais ils ne différencient pas les appels de fonction normaux et récursifs.
En supposant que les valeurs de retour inutilisées soient éliminées en silence, si vous aviez écrit le code comme ceci:
alors
search_list
ne retournerait qu'une valeur définie pour une liste vide (NULL) ou si le premier élément correspond à la valeur que vous recherchez. Dès que la fonction passe dans l'appel récursif, vous ne savez pas quel sera le résultat, car le résultat de l'appel récursif est rejeté.De plus, vous vous engagez à renvoyer une valeur de votre fonction, mais vous avez un chemin (le récursif) où vous ne spécifiez pas quelle valeur renvoyer. Selon la langue que vous utilisez, cela entraîne généralement un diagnostic obligatoire ou un comportement indéfini (ce qui est un raccourci pour: tout peut arriver et cela peut changer à tout moment sans préavis. Ne tenez personne d'autre que vous-même responsable s'il se trompe) votre présentation la plus importante). Il existe certaines situations où la valeur de retour manquante peut sembler fonctionner, mais cela peut changer la prochaine fois que vous exécutez le programme (avec ou sans recompilation).
la source
Deux choses; Renvoyer la liste entière dans le cas où vous trouvez le «x» que vous recherchez ne garantit pas nécessairement l'utilisation de la récursivité, mais à part cela, considérez les points suivants:
Supposons que vous recherchez une valeur de X = "décembre" et que votre liste soit la valeur numérique des mois de l'année, un pointeur sur le mois suivant et les éléments l-> de la liste sont les noms épelés des mois. (Janvier, février, ..., décembre). Vous avez besoin des trois retours pour les résultats possibles. Le premier, return (NULL) est nécessaire si la liste ne contient pas le X que vous recherchez. La seconde, (return (l)) retourne la liste, dans ce cas, vous permettant de savoir que vous avez trouvé votre "x". Le dernier est l'endroit où le modèle de pile entre en jeu. Les appels successifs à la fonction auraient mis à jour les variables locales (spécifiquement, l-> item) comme ceci:
la source