Liste injective

Messages : 0

Inscription : 01 nov. 2015 12:22

Profil de l'utilisateur : Élève de lycée

Liste injective

Message par Ghoscred92 » 09 déc. 2015 19:30

Bonjour :)
J'ai des exercices à faire en info et j'ai énormément de mal dans cette matière :(

voici l'énoncé :
" soit L une liste composées d'entiers uniquement
Ecrire un algorithme et la fonction Python retournant vraie si L est injective, faux sinon, sachant qu'une liste est injective si ses éléments sont 2 à 2 distincts

Inidication : On initialise une variable booléenne "res" à Vrai et on l'affectera à Faux à la première répétition, ce qui pourra provoquer l'arrêt du test
On commence par regarder si L[1], L[2], ... sont différents de L[0]
si L[1], L[2],... étaient tous différents de L[0], on compare L[2], L[3],... à L[1], ainsi de suite "

Messages : 3823

Inscription : 17 avr. 2012 21:19

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par bullquies » 09 déc. 2015 19:58

qu'est-ce qui pose problème? On te donne même l'algorithme :)
The Axiom of Choice is obviously true, the Well-Ordering Principle is obviously false, and nobody knows about Zorn's Lemma. - Jerry Bona

Messages : 0

Inscription : 01 nov. 2015 12:22

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par Ghoscred92 » 09 déc. 2015 20:06

J'arrive pas en le formaliser en Pseudo code ou en Python :(
J'ai énormément de mal avec le langage informatique et de programmation, j'ai vraiment pas les bases c'est horrible :(

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par loupi » 09 déc. 2015 20:53

Allez lance toi, donne nous un début de code, et on te filera un petit coup de main...

Messages : 0

Inscription : 01 nov. 2015 12:22

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par Ghoscred92 » 09 déc. 2015 23:35

en suivant les indications, je commence par faire res = True ( en Python)
ensuite, je fais n = lg(L)
ensuite je fais : pour i allant de 1 à n
if L = L[0]
res = faulse
return res
else
pour i allant de 2 à n
et je fais la même chose en changeant 0 par 1

mais c'est sûrement pas ça car il faudrait que je le fasse pour les n éléments de la liste donc c'est trop long je pense

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par fakbill » 10 déc. 2015 00:40

Prenons la liste [1,2,3,2,4]
Déroule nous les étapes de l'algo qu'on te donne.

Tu as compris le principe (heureusement ;) ) pour la première étape quand on teste l’égalité à L[0].
Par contre, tu n'as pas compris que ce n'est pas un cas particulier qu'il te suffit de répéter la même chose avec L[1] puis L[2]...bref de faire DEUX boucles. L'une qui boucle sur les éléments de la liste avec lesquels on teste l'égalité et une autre (que tu as écris pour la tester).

Il serait bien de comprendre ce qui te bloque exactement car on ne doit pas te cacher que cet exo est trivial une fois qu'on a compris ce qu'est une boucle et un test.

Prends un papier un crayon et fait "tourner" les algo sur papier. A chaque fois que tu refais "la même chose" c'est probablement qu'il te faut une boucle.
SPOILER:
:mrgreen: list(set(L)) == L
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par loupi » 10 déc. 2015 12:56

Il faut effectivement que tu fasses 2 boucles imbriquées, la 1ere qui parcourt la liste, et la 2ème qui compare l'élément courant (de la 1ere boucle) à chacun de ses suivants (de la 2ème boucle).
Voici le début, à toi de chercher la suite :
nbElements=len(L)
for i in range(nbElements-1) :
for j in range(i+1,nbElements) :

Messages : 0

Inscription : 01 nov. 2015 12:22

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par Ghoscred92 » 10 déc. 2015 14:51

ok est-ce que se serait ça (en langage Python) :

res=True
n=len(l)
i=0
while(i<n and res==True):
for j in range(i+1,n-1):
if l==l[j]:
res=False
i+=1
return (res)

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par loupi » 10 déc. 2015 15:20

c'est presque ça :wink:
- ta 2ème boucle doit s’arrêter à n et pas n-1, sinon tu ne compareras pas le dernier élément.
- par contre la 1ere boucle peut s’arrêter à n-1 et pas à n (i<n-1) car tu as déjà comparé les 2 derniers éléments, lors de l'itération i=n-2
un conseil, il faut toujours tester aux limites pour voir si ton pgm est robuste (dans ce cas, il faudrait tester avec une liste vide, une liste à 1 seul élément, une liste avec les 2 derniers éléments identiques, etc...)

tu peux aussi faire 2 boucles for (mais ton while est tout à fait valable et répond même mieux aux indications de ton exo), et mettre le tout dans une fonction, du style :
=> avec 2 boucles for, pour que tu vois la différence, dans ce cas pas besoin de variable res :

Code : Tout sélectionner

def injective(l) :
   n=len(l)
   for i in range(n-1) :
      for j in range(i+1,n) :
         if l[i]==l[j] : return(False)
   return(True)
Dernière modification par loupi le 10 déc. 2015 15:56, modifié 1 fois.

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Liste injective

Message par fakbill » 10 déc. 2015 15:39

Ghoscred92 : Utilise la balise "code" du forum sinon on ne peut pas lire ton python car l'indentation est perdue.
Beaucoup plus important : Une fois que tu as écrit un algo ou son implémentation en python, il est interdit de la "publier" sans le faire tourner à la main avec un papier et un crayon sur un exemple SIMPLE comme ici [1,2,3,2,4]. Ça permet de voir si ça fait ce qu'on pense ou pas. Il faut vraiment que tu le fasses tourner pas à pas. Ne dis pas "et là on boucle sur tous les machins". Non. L'exemple [1,2,3,2,4] est assez petit pour que tu puisses faire chaque pas de ton code...et voir que ça ne fait pas exactement ce qu'on te demande.

Si tu veux tu peux le faire avec un debuger mais je conseille de le faire à la main car le jour du concours tu n'auras pas de debug et car on comprend mieux en le faisant à la main.

Autre conseil: Vérifie TOUJOURS deux fois quand tu écris une boucle de 1 à N ou de 0 à N-1 ou < ou <= ... quand on débute on est très souvent "off by one" ("décaler d'un cran").
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Répondre