aide dm d info

violaine65

aide dm d info

Message par violaine65 » 29 déc. 2015 15:14

Bonjour j'ai un dm d'info pour la rentrée mais j'ai un petit soucis. J ai ecrit toutes les fonctions (elles fonctionnent correctement) mais la derniere tourne indéfiniment et n'affiche aucun résultat! Je suppose que c'est dû a un trop grand nombre d'opération pourtant je n'arrive pas à la simplifier plus que ça. Y a-t-il une erreur? Pouvez vous m'aider svp? :)

#a
def sc(u0,n):
if n<0: #cas ou n est négatif
return 'Erreur'
if n==0: #rang u0
return u0
else:
for i in range(1,n+1):
if u0%2==0:
u0=(u0//2) #si un est pair
else:
u0=(3*u0+1)//2 #si un est impair
return u0

#b
def trajectoire(u0):
list1=[]
n=0
while sc(u0,n-1)!=1: #tant que premier 1 pas atteint
list1 += [sc(u0,n)]
n+=1
return list1

#c
def temps_de_vol(u0):
return len(trajectoire(u0))-1 #nbr de termes ds trajectoire

#d
def temps_de_vol_alt(u0):
n=0
while sc(u0,n+1)>=u0: #tant que SC plus grand que u0
n+=1
return n

#e
def ne_fonctionne_pas(N):
liste_alt_max=[]
u0=0
while u0<=N:
liste_alt_max+=max(trajectoire(u0))
u0+=1
return liste_alt_max

Messages : 13

Inscription : 27 févr. 2013 16:45

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

Re: aide dm d info

Message par loupi » 29 déc. 2015 16:41

Mets ton code entre des balises <code></code> (bouton "Code") dans l'édition du message, pour avoir l'indentation, histoire que ce soit plus lisible dans un premier temps.

Avatar de l’utilisateur
np*

Messages : 0

Inscription : 28 nov. 2015 14:49

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

Re: aide dm d info

Message par np* » 29 déc. 2015 17:20

Que vaut trajectoire(0) ?

Il y aura ensuite une erreur car max() n'est pas une liste et ne peut donc pas être ajouté à liste_alt_max. Pour ajouter un nouvel élément à une liste il faut plutôt écrire :

Code : Tout sélectionner

liste += [element]
ou, sans doute plus clair :

Code : Tout sélectionner

liste.append(element)
c'est dû a un trop grand nombre d'opération pourtant je n'arrive pas à la simplifier plus que ça
Il y avait bien une erreur et le code fonctionne pour des valeurs raisonnables de N. Mais il y a quand même un problème, qui pénalisera probablement votre devoir si vous ne le corrigez pas. Lorsque vous calculez trajectoire, combien de fois calculez-vous le premier terme de la suite ? Si cela ne vous saute pas aux yeux, essayez la modification suivante de votre implémentation de la suite de Syracuse compressée (j'ai juste ajouté un print) :

Code : Tout sélectionner

def sc(u0,n):
    if n<0: #cas ou n est négatif
        return 'Erreur'
    if n==0: #rang u0
        return u0
    else:
        for i in range(1,n+1):
            print("Calcul du terme : " + str(i))
            if u0%2==0:
                u0=(u0//2) #si un est pair
            else:
                u0=(3*u0+1)//2 #si un est impair
    return u0
Comment corriger simplement ce problème ?

Rem : je ne sais pas comment est formulé votre DM et il est possible qu'il vous soit demandé en premier une fonction sc puis une fonction trajectoire, ce qui peut laisser entendre que la fonction trajectoire doit utiliser la fonction sc. Il serait plus simple d'écrire en premier la fonction trajectoire de laquelle on déduit immédiatement la fonction sc.
$ $P = N\!P^* ?$ $

violaine65

Re: aide dm d info

Message par violaine65 » 31 déc. 2015 14:55

Bonjour! Merci beaucoup de votre aide! J'ai retapé les codes de la fonction sc et de la fonction trajectoire mais ma derniere fonction ne fonctionne toujours pas malgré plusieurs tentatives :'(

Code : Tout sélectionner

#a
def sc(u0,n):
    list1=[u0]
    while u0!=1:
        if u0%2==0:
            u0=(u0//2) #si un est pair
        else:
            u0=(3*u0+1)//2 #si un impair
        list1+=[u0]
    return list1[n]
    
#b
def trajectoire(u0):
    list1=[u0]
    while u0!=1:
        if u0%2==0:
            u0=(u0//2) #si un est pair
        else:
            u0=(3*u0+1)//2
        list1+=[u0]
    return list1


#c
def temps_de_vol(u0):
    return len(trajectoire(u0))-1 #nbr de termes ds trajectoire

#d
def temps_de_vol_alt(u0):
    n=0    
    while sc(u0,n+1)>=u0: #tant que SC plus grand que u0
        n+=1
    return n

#e
def info_sc(N):
    list2=[]
    u0=0
    while u0!=N:
        list2+=[temps_de_vol(u0)]
        u0+=1
    return list2

Messages : 13

Inscription : 27 févr. 2013 16:45

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

Re: aide dm d info

Message par loupi » 31 déc. 2015 15:41

Tu as une boucle infinie dans la fonction trajectoire quand u0 vaut 0.

violaine65

Re: aide dm d info

Message par violaine65 » 31 déc. 2015 16:52

Oh j'ai compris mon erreur!!!! merci beaucoup!!! :P

Répondre