NSI : TP4, suite de la conjecture de Syracuse et découverte des tuples.

La fonction python vol que l’on peut copier-coller.

def vol(n):
    retour=str(n) # description du vol
    hauteur=n # hauteur max du vol fixée à n au départ
    long=1 # longueur du vol
    boucle=True # variable booléenne pour déterminer quand on met fin à l'algorithme
    nb=n # variable locale qui prend la valeur n de départ pour éviter des effets de bords
    while boucle:
        if nb>hauteur : # on vérifie si le nombre dépasse la hauteur
            hauteur=nb # si oui, on modifie la hauteur
        long+=1 # on ajoute 1 étape, donc 1 à la longueur du vol
        if nb%2==0: # on applique l'algorihtme de syracuse
            nb=nb//2
        else :
            nb=nb*3+1
        retour+=","+str(nb) # on ajoute la valeur au vol
        if nb==1 : # on s'arrête lorsque nb==1
            boucle=False
    return retour,long,hauteur # on retourne les 3 valeurs attendues

La fonction vol à compléter en utilisant la notion de tuples.

def vol(n):
    retour=(n,) # description du vol, retour est un tuple
    boucle=True # variable booléenne pour déterminer quand on met fin à l'algorihtme
    nb=n # variable locale qui prend la valeur n de départ pour éviter des effets de bords
    while boucle:
        if nb%2==0: # on applique l'algorihtme de syracuse
            nb=nb//2
        else :
            nb=nb*3+1
        ....
        if nb==1 : # on s'arrête lorsque nb==1
            boucle=False
    return retour, ... , ... # on retourne les 3 valeurs attendues 

Pour en savoir plus sur la conjecture de Collatz :
https://fr.m.wikipedia.org/wiki/Conjecture_de_Syracuse

Correction finale du tp avec tracés de différentes courbes

import numpy as np # importe la bibliothèque numpy
import matplotlib.pyplot as plt # importe la bibliothéque matplotlib pour le tracé des courbes

def vol(n):
    retour=(n,) # description du vol comme un tuple
    boucle=True # variable booléenne pour déterminer quand on met fin à l'algorithme
    nb=n # variable locale qui prend la valeur n de départ pour éviter des effets de bords
    while boucle:
        if nb%2==0: # on applique l'algorihtme de syracuse
            nb=nb//2
        else :
            nb=nb*3+1
        retour+=(nb,) # on ajoute la valeur au vol
        if nb==1 : # on s'arrête lorsque nb==1
            boucle=False
    return retour,len(retour),max(retour) # on retourne les 3 valeurs attendues

def hauteur_max(n):
    ''' Détermine quel est l'entier compris entre 1 et n
    qui a le vol le plus haut
    return : k, hauteur du vol de k ( tuple)
    '''
    haut_max=0
    k=1
    for i in range(1,n+1):
        if vol(i)[2]>haut_max:
            haut_max=vol(i)[2]
            k=i
    return k,haut_max

def longueur_max(n):
    ''' Détermine quel est l'entier compris entre 1 et n
    qui a le vol le plus haut
    return : k, hauteur du vol de k ( tuple)
    '''
    long_max=0
    k=1
    for i in range(1,n+1):
        if vol(i)[1]>long_max:
            long_max=vol(i)[1]
            k=i
    return k,long_max

def tracer_courbe_vol(n):
    ''' trace le vol du nombre n
    return : graphique
    '''
    vol_n=vol(n)[0]
    print(vol_n)
    x=[]
    y=[]
    for i in range(len(vol_n)):
        x.append(i)
        y.append(vol_n[i])
    plt.plot(x, y)
    plt.show() # affiche la figure a l'ecran

def tracer_courbe_hauteur_vol(n):
    '''
    trace la courbe (k,hauteur du vol de k)
    pour k compris entre 1 et n
    return : graphique
    '''
    x=[]
    y=[]
    for i in range(1,n+1):
        x.append(i)
        y.append(vol(i)[2])
    plt.plot(x, y)
    plt.show() # affiche la figure a l'ecran

def tracer_courbe_longueur_vol(n):
    '''
    trace la courbe (k,longueur du vol de k)
    pour k compris entre 1 et n
    return : graphique
    '''
    x=[]
    y=[]
    for i in range(1,n+1):
        x.append(i)
        y.append(vol(i)[1])
    plt.plot(x, y)
    plt.show() # affiche la figure a l'ecran