Inscription / Connexion Nouveau Sujet
Niveau première
Partager :

Python et suite de Syracuse

Posté par
KMomo
28-12-19 à 12:06

Bonjour,
J?ai un exercice sur Python et la suite de Syracuse que je n?arrive pas à terminer.
Voici l?énoncé :
Soir (uN) la suite définie par u0=a et pour tout n entier égal ou supérieur à 0
1. Calculer les 5 premiers termes de la suite de Syracuse pour a=2 puis pour a=3
u0 = 2
u1 = 1
U2 = 4
U3 = 2
U4= 1

U0 = 3
U1= 10
U2= 5
U3= 16
U4= 8

J?ai réussi sans aucun soucis c?est la partie 2 avec Python qui me pose soucis j?ai un algorithme à compléter et à faire tourner :

La conjoncture de Syracuse non démontré à ce jour dit que la suite finit toujours par atteindre la valeur 1 à un certain rang
L?objectif est de créer un algorithme permettant de déterminer la plus petite valeur de n telle que un=1
a) compléter l?algorithme Python ci contre ( en photo)
b) faites tourner le programme pour a=5 a = 10 et a =15 et dire ce qu?il affiche

Le programme à compléter :
def f(a) :
     n=0
     u=a
     while u!=1 :
          if u%2==0 :
                u=....
           else :
                u=....
                n=....
print(.....)
Je n?ai pas compris ce que le programme doit afficher : la durée du vol ou l?altitude ?
Et j?ai fait le programme Python mais quand je remplace a par la valeur aucun résultat ne m?est renvoyé (voir photo)

Merci pour tout aide

* Sylvieg > Première image effacée. Merci d'utiliser les outils mis à ta disposition pour écrire les formules mathématiques *

Python et suite de Syracuse

Posté par
Glapion Moderateur
re : Python et suite de Syracuse 28-12-19 à 12:20

Citation :
Je n'ai pas compris ce que le programme doit afficher : la durée du vol ou l'altitude ?

l'énoncé dit "L'objectif est de créer un algorithme permettant de déterminer la plus petite valeur de n telle que un=1" donc c'est la durée de vol.

Pourquoi ce n=5 dans ton programme ? n = n+1 plutôt
et tu as oublié d'écrire le u = a

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 12:29

Comme ça ?

Python et suite de Syracuse

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 12:30

J'indique bien que a=5 mais rien ne se passe ?

Python et suite de Syracuse

Posté par
Glapion Moderateur
re : Python et suite de Syracuse 28-12-19 à 12:31

si tu veux le résultat pour 5, il faut mettre print f(5) à la fin, pas print(f(a))

dans ce que tu as écris, a n'a jamais reçu de valeur.

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 12:41

Toujours rien...
Depuis toute a l'heure j'essaye de modifier des trucs mais ça ne marche pas

Python et suite de Syracuse

Posté par
ty59847
re : Python et suite de Syracuse 28-12-19 à 12:50

Il y a plusieurs choses ui ne ont pas dans ton code.

- L'instruction print f(5) est à l'intérieur de la fonction f.  Elle devrait être à l'extérieur.

- Regarde ta boucle while ...
Dans cette boucle, tu modifies quelles variables ? tu modifies u et n.
Et pour calculer u et n, tu utilises quoi ? tu utilises a uniquement ( et a ne change jamais)
Tu pourras donc passer 1000 ou 500000 fois dans cette boucle, u aura toujours la même valeur.

Posté par
mathafou Moderateur
re : Python et suite de Syracuse 28-12-19 à 13:05

Bonjour,

c'est pire

dans la définition de f(a) se trouve l'instruction print(f(a)) qui fait un appel à f(a) elle même

bref la fonction s'appelle elle même !!
et ce indéfiniment d'ailleurs vu que a est inchangé
et remplacer print(f(a)) print(f(5)) n'y changerait rien, à part mettre a = 5 dans les appels récursifs suivant l'appel initial

à la fin de cette fonction c'est print(n) qu'il faut mettre
quand on a fini la boucle while, que fait la fonction ? elle imprime son résultat , qui est la valeur de n à la fin de la boucle

de plus l'indentation du else est mauvaise : elle est en dehors du while !!
alors qu'elle devrait être au même niveau d'indentation que le if, à l'intérieur du while

n=n+1 est aussi mal indenté :
il doit être exécuté dans le while, à chaque boucle et dans tous les cas , que ce soit le cas if ou le cas else

enfin
tel quel ce programme ne fait rien
ils ne fait que définir la fonction f
mais aucune instruction n'est exécutée

pour les exécuter il faut appeler la fonction f
par exemple dans la console en tapant f(5)
ou à la fin du programme, en dehors de la définition en écrivant avec indentation nulle print(f(5))

une autre façon de faire (plus saine) est que la fonction renvoie son résultat en remplaçant print(n) par return n
ce résultat pourrait alors être utilisé dans un programme plus vaste qui appellerait f(a) avec diverses valeurs successives de a
ça ne change rien pour l'utilisation car l'appel de f(5) en ligne de commande affiche automatiquement la "valeur" de f(5) c'est à dire ce qu'a renvoyé la fonction,
sans besoin d'écrire explicitement un print

Posté par
mathafou Moderateur
re : Python et suite de Syracuse 28-12-19 à 13:08

ty59847 :
oui, ça aussi, les calculs effectués ne sont pas bons non plus...
(je m'étais attaché à la structure uniquement)

Posté par
ty59847
re : Python et suite de Syracuse 28-12-19 à 13:11

Ce que je dis, tu le dis aussi dans les 5 premières lignes de ton message.

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 13:14

Et la ? Pourquoi j'ai un message d'erreur....

Python et suite de Syracuse

Posté par
Glapion Moderateur
re : Python et suite de Syracuse 28-12-19 à 13:19

mais ici encore, a n'a pas reçu de valeur.
une fois la fonction définie, il faut bien l'appeler par un f(5)
(et puis je vois un 3*1+1 et pas un 3*a + 1)

bon mais je ne suis pas assez familiarisé avec la syntaxe Python pour ne pas te dire de bêtises, je laisse les autres te répondre.

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 13:22

"mais ici encore, a n'a pas reçu de valeur"
Comment fait-on pour lui en donner une ? La valeur de 5 par exemple

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 13:23

Meme en mettant print f(5) à la fin comme tu m'as dit dans ton message à 12:31 ça ne marche pas erreur de syntaxe

Ok merci quand même ^^

Python et suite de Syracuse

Posté par
Glapion Moderateur
re : Python et suite de Syracuse 28-12-19 à 13:35

moi j'aurais mis un print(n) ou un return n dans le corps de la définition de la fonction.

puis en dehors de la fonction, un print(f(5)) qui appelle la fonction en lui passant le paramètre a=5

Posté par
mathafou Moderateur
re : Python et suite de Syracuse 28-12-19 à 13:37

je dois quitter en urgence
pour avoir des réponses rapides : copier coller ton code au lieu d'en prendre des photos
et le mettre entre deux balises "code" (bouton < / > dans le bandeau sous le message)

Posté par
ty59847
re : Python et suite de Syracuse 28-12-19 à 13:47

Tu fais print(f(5))
Comment Python peut-il deviner quoi afficher ? il doit afficher la dernière valeur de u ? de a ? de n ?
Python ne peut pas deviner, donc il dit qu'il y a une erreur.

Dans la fonction f(), ajoute une instruction return n ou return a ou return u...
Et dans ce cas , Python n'aura plus à deviner ce que tu veux, il saura que tu veux afficher soit n, soit a, soit u.

Posté par
ty59847
re : Python et suite de Syracuse 28-12-19 à 13:49

Et en vrai, Python dit qu'il y a une erreur, parce qu'il manque une parenthèse.
Dans la ligne print f(5)), il y a 2 parenthèses fermantes pour 1 parenthèse ouvrante, ce n'est pas bon.

Posté par
KMomo
re : Python et suite de Syracuse 28-12-19 à 13:53

Ok merci j'ai fait ça :

def f(a):
    n=0
    u=a
    while u!=1:
        if u%2==0:
            u=a/2
        else:
            u=3*a+1
            n=n+1
    return n
print(f(5))


Et il me renvoie toujours rien ....

*** Console de processus distant Réinitialisée *** 
>>> 

Posté par
ty59847
re : Python et suite de Syracuse 28-12-19 à 15:52

C'est mieux : L'instruction print(f(5)) fait que Python va effectivement excuter la fonction f. Et il y a une instruction return dans cette fonction f, donc f(5), c'est la valeur de n quand la fonction se finit.

Reste le problème de la boucle while.
Relis les conseils d'il y a 2 heures. On t'avait déjà dit pourquoi cette boucle ne pouvait pas marcher.

Indice : le message renvoyé par Python explique toujours plus ou moins bien ce que ne va pas.  Dans la copie d'éran précédent, il mettait un petit symbole sous le f de f(5)), parce que après print, ça ne peut pas pêtre f, ça ne peut être que (.

Ici, le message de Python n'est pas très explicite, mais il dit en gros : Processus abandonné, trop long.

Posté par
mathafou Moderateur
re : Python et suite de Syracuse 30-12-19 à 10:25

on a déja dit dès le début où il y avait des erreurs et pourquoi
maintenant si tu ne lis pas ce qu'on te dit ...

def f(a):
    n=0
    u=a
    while u!=1:
        if u%2==0:
            u=a/2 <---- erreur
        else:
            u=3*a+1   <----- erreur
            n=n+1   <----- erreur 
    return n
print(f(5))


relis ce qu'on a dit ...
a est inchangé et donc u donne toujours la même valeur et la boucle ne se terminera jamais
n=n+1 est à faire dans chaque boucle et pas seulement dans le cas else



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1768 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !