Topic de JePisseDuCode :

[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 ? :hap:

merci d'avance :oui:

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 ?

mal au crane, c'est tellement simple en plus https://image.noelshack.com/fichiers/2017/27/2/1499168768-12h11legroslard.png

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é

C'est pour calculer le nombre de fois que l'on avance de 1 dans la mémoire avant d'arriver à la fin de la string.
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é.
T'es en quelle année ? Quelle école ??

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. :hap:

ç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+ ??

récursif classique https://image.noelshack.com/fichiers/2022/24/6/1655577587-ahi-triangle-clopent.png
le str + 1 en paramètre c'est juste pour avancer le pointeur de 1 https://image.noelshack.com/fichiers/2022/24/6/1655577587-ahi-triangle-clopent.png

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 ? :hap:

merci d'avance :oui:

C'est du rust ?

C'est quoi ce langage du démon qui permet d'ajouter un nombre entier à un pointeur sur chaîne : str+1 ? :peur:
sinon on va pas se mentir, tu dois comprendre le code seul sinon t'avanceras pas je le crains

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. :hap:

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 fini

on 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 ? :peur:

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é.

pourquoi tu fais pas string.length ? https://image.noelshack.com/fichiers/2021/43/4/1635454847-elton-john-tison-golem.png
C’est quoi comme language ?

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
En ligne sur JvArchive 117