[DEV] QUELQU'UN peut-il M'EXPLIQUER ce qu'il se PASSE dans ce CODE ultra SIMPLE ?
int my_strlen_rec(char const *str) {
if (str[0] == 0) {
return 0;
}
return (1 + my_strlen_rec(str + 1));
}
ce programme sert à calculer la longueur d'une string, en itératif c'est ultra simple vu qu'il suffit de faire un compteur en l'initiant à 0 puis l'incrémenter à chaque fois qu'il avance dans la string, mais en récursif, il y a beau y avoir 3 lignes, je comprends que dalle à la dernière, quelqu'un pourrait-il avoir l'âme charitable de me l'expliquer ?
merci d'avance
ce que je comprends pas c'est pourquoi 1 + strlen(str+1) au lieu de simpmement faire strlen(str+1) ?
c'est quoi qui change en fait ?
Strlen mais de façon recursive.
La première partie est la condition d'arrêt;
Et en dessous bah ça continue quoi enfin rien de très compliqué
En gros, ca va aller en profondeur pour finir par retourner 0, puis 1, puis 2, puis 3, puis4, etc... selon le nombre de fois que la récursion a été exécuté.
Je suppose qu'un pointeur vers une string finit par 0 (par là j'entends l'octet de valeur 0).
L'appel récursif avance le pointeur de 1 octet (donc l'octet de position 0 de l'appel récursif est l'octet 1 de l'exécution précédente), de ce fait au bout d'un moment on atteint l'octet final de valeur 0 et on sait qu'on a parcouru toute la chaîne.
À ce moment là on remonte la pile (donc on additionne tout les 1 des appels récursifs) et on obtient la longueur de la chaîne.
En tout cas c'est mes suppositions avec mes connaissances un peu vieilles du C.
ça ajoute 1 à ta variable et aussi à son identifiant ce qui fait que le numéro devient null quand la chaine a fini
on dirait du python si je ne m'abuse
Le 27 octobre 2022 à 20:50:26 :
Strlen mais de façon recursive.La première partie est la condition d'arrêt;
Et en dessous bah ça continue quoi enfin rien de très compliqué
je suis au courant mec, mais le truc qui me nique le cerveau c'est pourquoi 1 + strlen(str+1) au lieu de simplement faire avancer avec simplement strlen(str + 1)
il apporte quoi de plus ce 1+ ??
Le 27 octobre 2022 à 20:45:04 :
<code>int my_strlen_rec(char const *str) {if (str[0] == 0) {
return 0;
}return (1 + my_strlen_rec(str + 1));
}</code>ce programme sert à calculer la longueur d'une string, en itératif c'est ultra simple vu qu'il suffit de faire un compteur en l'initiant à 0 puis l'incrémenter à chaque fois qu'il avance dans la string, mais en récursif, il y a beau y avoir 3 lignes, je comprends que dalle à la dernière, quelqu'un pourrait-il avoir l'âme charitable de me l'expliquer ?
merci d'avance
C'est du rust ?
Le 27 octobre 2022 à 20:47:11 :
ce que je comprends pas c'est pourquoi 1 + strlen(str+1) au lieu de simpmement faire strlen(str+1) ?c'est quoi qui change en fait ?
J'ai pas fait de C depuis des siècles je dis peut-être n'importe quoi mais je vais essayer :
Prenons " (1 + my_strlen_rec(str + 1)); "
le 1+ extérieur comptabilise le caractère actuel, tandis que le +1 à l'intérieur de l'appel récursif fait en sorte de pousser l'offset du string pour qu'il commencer à compter à partir du caractère suivant
Exemple : ton *str c'est -> "bonjour", le *str +1 sera ->"onjour", donc la taille sera 1 + (taille de onjour)
et le 0 sert à détecter le marqueur de fin de chaîne
Le 27 octobre 2022 à 20:50:59 :
T'es en quelle année ? Quelle école ??
epitech première année, j'ai honte d'avoir mal compris un truc aussi con
Le 27 octobre 2022 à 20:51:05 :
Je suppose qu'un pointeur vers une string finit par 0 (par là j'entends l'octet de valeur 0).
L'appel récursif avance le pointeur de 1 octet (donc l'octet de position 0 de l'appel récursif est l'octet 1 de l'exécution précédente), de ce fait au bout d'un moment on atteint l'octet final de valeur 0 et on sait qu'on a parcouru toute la chaîne.
À ce moment là on remonte la pile (donc on additionne tout les 1 des appels récursifs) et on obtient la longueur de la chaîne.En tout cas c'est mes suppositions avec mes connaissances un peu vieilles du C.
Le 27 octobre 2022 à 20:51:19 :
ça ajoute 1 à ta variable et aussi à son identifiant ce qui fait que le numéro devient null quand la chaine a finion dirait du python si je ne m'abuse
putain je vous adore merci les clés
et non clochardasso8, c'est du C
Le 27 octobre 2022 à 20:51:37 :
Le 27 octobre 2022 à 20:50:26 :
Strlen mais de façon recursive.La première partie est la condition d'arrêt;
Et en dessous bah ça continue quoi enfin rien de très compliqué
je suis au courant mec, mais le truc qui me nique le cerveau c'est pourquoi 1 + strlen(str+1) au lieu de simplement faire avancer avec simplement strlen(str + 1)
il apporte quoi de plus ce 1+ ??
parce que ça boucle pas seulement sur le nombre de caractères mais aussi sur le tableau d'index
Le 27 octobre 2022 à 20:52:32 :
C'est quoi ce langage du démon qui permet d'ajouter un nombre entier à un pointeur sur chaîne : str+1 ?
Le C permet de faire ça
Le 27 octobre 2022 à 20:51:37 :
Le 27 octobre 2022 à 20:50:26 :
Strlen mais de façon recursive.La première partie est la condition d'arrêt;
Et en dessous bah ça continue quoi enfin rien de très compliqué
je suis au courant mec, mais le truc qui me nique le cerveau c'est pourquoi 1 + strlen(str+1) au lieu de simplement faire avancer avec simplement strlen(str + 1)
il apporte quoi de plus ce 1+ ??
Car à chaque fois la méthode retourne un nombre. Arrivé à la fin de ta string ça va retourner 0, donc ça fera 1 + 0, puis ça retournera 1 donc ça fera 1+1, puis ca retournera 2 donc ça fera 1+2, etc selon le nombre de profondeur de la récursivité.
Le 27 octobre 2022 à 20:47:11 :
ce que je comprends pas c'est pourquoi 1 + strlen(str+1) au lieu de simpmement faire strlen(str+1) ?c'est quoi qui change en fait ?
ben ça compte quoi ... c'est du récursif. Donc y a un + 1 à chaque appel
Données du topic
- Auteur
- JePisseDuCode
- Date de création
- 27 octobre 2022 à 20:45:04
- Nb. messages archivés
- 41
- Nb. messages JVC
- 42