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
*
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.
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 et
.
Et pour calculer et
, tu utilises quoi ? tu utilises
uniquement ( et
ne change jamais)
Tu pourras donc passer 1000 ou 500000 fois dans cette boucle, aura toujours la même valeur.
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
ty59847 :
oui, ça aussi, les calculs effectués ne sont pas bons non plus...
(je m'étais attaché à la structure uniquement)
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.
"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
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 ^^

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
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)
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.
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.
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))
*** Console de processus distant Réinitialisée ***
>>>
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.
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))
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :