Exercice 21
5 participants
Page 1 sur 1
Exercice 21
Est ce que quelqu'un aurait compris la résolution de l'exercice 21 ?
Merci
Merci
CharlotteBD- Dopamine
-
Nombre de messages : 78
Année d'étude : MA1
Section : Bioingénieur
Date d'inscription : 27/12/2010
Re: Exercice 21
+1 pour l'explication, j'ai vraiment du mal sur la double boucle...
Merci !
Merci !
Le Renard Montois O-o- Dopamine
-
Nombre de messages : 115
Année d'étude : Diplomé(e)
Section : Bioingénieur
Option : Chimie et bioindustries
Date d'inscription : 15/09/2009
Re: Exercice 21
+2 pour l'explication. ha ha on donne des faux espoirs à charlotte^^
Colin- Psychotrope
-
Nombre de messages : 289
Année d'étude : BA1
Section : Gestion en Environnement Urbain
Option : Agronomie - Option tropical
Date d'inscription : 07/06/2010
Re: Exercice 21
Bon, la première fonction renvoie juste le nombre de caractères identiques qui se suivent au début d'une chaine donnée.
La seconde fait une double boucle pour renvoyer le nème nbre de conway:
-la boucle principale (while i <=n), construit a chaque fois un nbre de conway (d'abord le premier (1), puis le deuxième(11).....jusqu'au nème) et ne renvoie au final que ce nème nombre (en gros elle calcule le nème à partir de tous ceux qui sont avant).
-pour calculer un nombre de conway, il faut une boucle, la deuxième(while j< len (res) ), qui parcourt tous les caractères du nombre d'avant (le cas de base, n= 1, est fixé res = '1'). Pour chaque caractère, elle compte ceux consécutifs (grâce a la première fonction), et crée le nouveau nombre comme ca: ex: '11' -> '2'+'1' = '21'. Ensuite elle passe au caractère suivant qui est différent, donc il faut faire j = j +count ex: pour '1112', on fait le cas j=0, on compte 3 '1' donc apres on passe à j= 0+3= 3, on compte 1 '2'. Donc la nouvelle chaine ainsi crée remplace le 'res' précédent, et est utilisée pour construire le nombre suivant (on recommence la boucle principale).
Après avoir relu ceci trois fois vous comprendrez^^
La seconde fait une double boucle pour renvoyer le nème nbre de conway:
-la boucle principale (while i <=n), construit a chaque fois un nbre de conway (d'abord le premier (1), puis le deuxième(11).....jusqu'au nème) et ne renvoie au final que ce nème nombre (en gros elle calcule le nème à partir de tous ceux qui sont avant).
-pour calculer un nombre de conway, il faut une boucle, la deuxième(while j< len (res) ), qui parcourt tous les caractères du nombre d'avant (le cas de base, n= 1, est fixé res = '1'). Pour chaque caractère, elle compte ceux consécutifs (grâce a la première fonction), et crée le nouveau nombre comme ca: ex: '11' -> '2'+'1' = '21'. Ensuite elle passe au caractère suivant qui est différent, donc il faut faire j = j +count ex: pour '1112', on fait le cas j=0, on compte 3 '1' donc apres on passe à j= 0+3= 3, on compte 1 '2'. Donc la nouvelle chaine ainsi crée remplace le 'res' précédent, et est utilisée pour construire le nombre suivant (on recommence la boucle principale).
Après avoir relu ceci trois fois vous comprendrez^^
Arnaud- Dopamine
-
Nombre de messages : 109
Année d'étude : BA3
Section : Bioingénieur
Date d'inscription : 21/09/2009
Re: Exercice 21
J'ai compris (fin je pense) :p
Donc tout d'abord j'ai fait une autre fonction qui pour moi est plus simple et vérifié par alessia, elle devrait marcher:
def conway_principe (l,i) #cette fonction regarde dans la liste l combien de fois l'élément à la position i est repetee.
count=1 doffice on commence a 1 comme d'office on a une fois l'element
while i+1 < len (l) and l[i]==l[i+1]: on dit i+1 count +=1 si ya bien répétition on a plus d'élément
i+=1 et on continue pour voir si encore apres on aurait pas le meme élément qu'a la position i
return count
def conway_suite (l): #la fonction va faire la suite de nombre
res=''
i=0
while i res.append (n+l[i])
return res
def conway (n): #la fonction va chercher le nieme terme de la suite de Conway.
suite='1'
i=2
while i<=n:
suite=conway_suite (suite)
i=i+1
return suite
J'explique la méthode dans le cour
def next_count(s):
"""Renvoie le nombre de caractères successifs au début de la chaîne s égaux au premier caractère."""
fini = False
i = 1 expliqué avant
while i < len(s) and not fini: on rajoute le not fini pour se dire qu'on l'a pas encore fait lelement qu'on est entrain de traiter (jcrois que c'est ca c'est comme ca que je comprend car apres des qu'on a plus la meme chose on va mettre fini = true et donc ainsi on peut passer a l'element apres)
if s[i] == s[0]:
i += 1
else:
fini = True
return i
def conway(n):
"""Renvoie le n-ième nombre de la suite rigolote de Conway."""
res = -1
if n > 0: dans ma fonction je suppose deja que n>0 car ce serait pas logique de demander un terme negatif
res = '1'
i = 2 on dit que i= à 2 car on dit deja le premier terme qui est egale a 1
while i <= n: # for i in range(2,n+1): la suite va permettre de faire la suite jusque quand on arrive au terme voulu
# construit le i-ème nombre de Conway
j = 0
next_res = ''
while j < len(res): on refait une boucle car on commence au premier terme de la suite qui est un au début pour arriver au deuxieme terme
char = res[j] on garde la valeur qu'on est entrain de traiter pour ainsi la mettre apres
count = next_count(res[j:len(res)]) on va retenir le nombre de fois que l'element a été répété grace a la fonction qu'on a décrite avant. On met (res[j:len(res)]) car on de l'endroit ou on est jusque la longueur du terme ou on est non compris. (Si c'est pas logique, mettez des chiffres et mettez vous devant la suite)
next_res = next_res + str(count) + char donc la next_res va valoir le nombre de répétition (mis en chaine pour pas que le count et le + char s'additionne) suivi de l'élément qu'on était entrain de traité
j = j + count et on continue au suivant (on fait + count car on veut directement passer au prochain élément de la suite sans prendre une répétition)
res = next_res
i += 1
return res
[b][i]
J'espere avoir été clair. Je ne dis pas que tout ce que je dis est bon et je me suis pas relue donc possible d'erreur, sorry d'avance
Donc tout d'abord j'ai fait une autre fonction qui pour moi est plus simple et vérifié par alessia, elle devrait marcher:
def conway_principe (l,i) #cette fonction regarde dans la liste l combien de fois l'élément à la position i est repetee.
count=1 doffice on commence a 1 comme d'office on a une fois l'element
while i+1 < len (l) and l[i]==l[i+1]: on dit i+1
i+=1 et on continue pour voir si encore apres on aurait pas le meme élément qu'a la position i
return count
def conway_suite (l): #la fonction va faire la suite de nombre
res=''
i=0
while i
return res
def conway (n): #la fonction va chercher le nieme terme de la suite de Conway.
suite='1'
i=2
while i<=n:
suite=conway_suite (suite)
i=i+1
return suite
J'explique la méthode dans le cour
def next_count(s):
"""Renvoie le nombre de caractères successifs au début de la chaîne s égaux au premier caractère."""
fini = False
i = 1 expliqué avant
while i < len(s) and not fini: on rajoute le not fini pour se dire qu'on l'a pas encore fait lelement qu'on est entrain de traiter (jcrois que c'est ca c'est comme ca que je comprend car apres des qu'on a plus la meme chose on va mettre fini = true et donc ainsi on peut passer a l'element apres)
if s[i] == s[0]:
i += 1
else:
fini = True
return i
def conway(n):
"""Renvoie le n-ième nombre de la suite rigolote de Conway."""
res = -1
if n > 0: dans ma fonction je suppose deja que n>0 car ce serait pas logique de demander un terme negatif
res = '1'
i = 2 on dit que i= à 2 car on dit deja le premier terme qui est egale a 1
while i <= n: # for i in range(2,n+1): la suite va permettre de faire la suite jusque quand on arrive au terme voulu
# construit le i-ème nombre de Conway
j = 0
next_res = ''
while j < len(res): on refait une boucle car on commence au premier terme de la suite qui est un au début pour arriver au deuxieme terme
char = res[j] on garde la valeur qu'on est entrain de traiter pour ainsi la mettre apres
count = next_count(res[j:len(res)]) on va retenir le nombre de fois que l'element a été répété grace a la fonction qu'on a décrite avant. On met (res[j:len(res)]) car on de l'endroit ou on est jusque la longueur du terme ou on est non compris. (Si c'est pas logique, mettez des chiffres et mettez vous devant la suite)
next_res = next_res + str(count) + char donc la next_res va valoir le nombre de répétition (mis en chaine pour pas que le count et le + char s'additionne) suivi de l'élément qu'on était entrain de traité
j = j + count et on continue au suivant (on fait + count car on veut directement passer au prochain élément de la suite sans prendre une répétition)
res = next_res
i += 1
return res
[b][i]
J'espere avoir été clair. Je ne dis pas que tout ce que je dis est bon et je me suis pas relue donc possible d'erreur, sorry d'avance
CharlotteBD- Dopamine
-
Nombre de messages : 78
Année d'étude : MA1
Section : Bioingénieur
Date d'inscription : 27/12/2010
Re: Exercice 21
jpense que ta fonction va avoir un probleme pcq pour def conway_suite (l) tu n'utilise pas def conway_principe (l,i)... mais sinon merchi! j'ai dja compris qql trucs en plus!
Lise- Psychotrope
-
Nombre de messages : 328
Année d'étude : BA3
Section : Bioingénieur
Date d'inscription : 21/05/2010
Re: Exercice 21
Tu as raison j'ai oublié d'écrire une ligne :p
CharlotteBD- Dopamine
-
Nombre de messages : 78
Année d'étude : MA1
Section : Bioingénieur
Date d'inscription : 27/12/2010
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|