Rechercher
Résultats par :
Recherche avancée
Mots-clés

caractères  taille  vider  convertir  

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités

Aucun

Voir toute la liste


Partagez
Voir le sujet précédentAller en basVoir le sujet suivant
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] [résolu] Suite de Syracuse

le Mon 14 Jun - 15:48
A mon tour :

La suite de Syracuse est définie ainsi :
- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

Par exemple, si on part de 10, on obtient successivement 10/2=5, puis 3*5+1=16, puis 16/2=8, puis 4, puis 2, puis 1.

On pense (mais personne ne sait le montrer...) qu'une telle suite se termine toujours par 1, et on appelle durée de vol le nombre d'opérations nécessaires pour y arriver. Par exemple, en partant de 10, on voit qu'il a fallu 6 opérations : la durée de vol de l'entier 10 est égal à 6.

La question posée est donc d'écrire un programme qui, un entier étant donné par l'utilisateur, calcule et affiche sa durée de vol.
Member
Messages : 121
Date d'inscription : 2010-05-15
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Mon 14 Jun - 20:37
Voila ma proposition

Code:
Livre :
Saute mouton

Paragraphe :
Il était une fois
Les rôles :

benji & ricola est un nombre vide
Les actions :

Tu questionnes benji sur "Choisis un nombre !"
Tu vas vers l'iliad

Paragraphe :
iliad
Les rôles :

benji & ricola est un nombre
pitisuisse est un drapeau vide
rolala est un nombre valant 1
Les actions :

pitisuisse vaut benji inf rolala
Si benji est égal à rolala alors tu vas vers l'odysse
Si pitisuisse est égal à vrai alors tu vas vers l'évèque de Rome
Sinon, tu vas vers l'analogie

Paragraphe :
odysse
Les rôles :

finou est un texte valant "Si tu choisis 1, ce n'est pas très interessant.
.
.
"
Les actions :

Tu affiches finou
Tu vas vers Il était une fois

Paragraphe :
évèque de Rome
Les rôles :

finui est un texte valant "Choisis un nombre superieur à 1 !!!"
Les actions :

Tu affiches finui
Tu vas vers Il était une fois

Paragraphe :
analogie
Les rôles :

benji & ricola est un nombre
rififi & brouhaha est un nombre vide
Les actions :

brouhaha vaut benji/2
rififi vaut décimal brouhaha
Si rififi est égal à 0 alors tu vas vers la quiche
Sinon, tu vas vers la foire

Paragraphe :
quiche
Les rôles :

benji & ricola est un nombre
Les actions :

benji vaut benji/2
ricola vaut ricola+1
Si benji est égal à 1 alors tu vas vers le final
Sinon, tu vas vers l'analogie

Paragraphe :
foire
Les rôles :

benji & ricola est un nombre
Les actions :

benji vaut 3*benji+1
ricola vaut ricola+1
Si benji est égal à 1 alors tu vas vers le final
Sinon, tu vas vers l'analogie

Paragraphe :
final
Les rôles :

ricola est un nombre
vol est un texte valant "La durée de vol est de "
Les actions :

Tu ajoutes ricola dans le vol
Tu affiches le vol
Tu termines
Je sais pas trop comment ça marche, surtout au niveau du "paire/pas paire", mais ça marche <img src=" title="Big Grin" />

Édition : amélioration de la bête avec contournement des erreur " x<
1 ou x=1"
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Tue 15 Jun - 20:02
Bon, comme l'espèce drapeau n'est pas définie chez moi, j'ai dû modifier en conséquence le début du programme, mais sinon ça marche très bien... Bravo !

Mais on peut faire plus court (et en un seul paragraphe) avec l'instruction "tant que"... Veux-tu essayer ?
Member
Messages : 121
Date d'inscription : 2010-05-15
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Tue 15 Jun - 20:17
Faire court Surprised ! C'est pas vraiment mon truc, et je ne suis pas bien à l'aise avec les bouboucles, mais bon, pourquoi pas...

Petite question, juste comme ça, il y a un moyen de savoir directement si un nombre est pair avec Linotte ?
Autre question : Est-il possible de faire de sous-sous-paragraphes ?

Édition : Question supplémentaire !
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Tue 15 Jun - 20:26
Pour le test de parité, le plus simple est sans doute d'utiliser l'instruction mod, qui donne le reste de la division d'un entier par un autre.

Par exemple, n mod 2 donne le reste de la division de n par 2. S'il vaut 1, c'est que n est impair, et s'il vaut 0 c'est que n est pair.
Member
Messages : 121
Date d'inscription : 2010-05-15
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Tue 15 Jun - 20:46
Mouais, je vais faire de la récup, ça revient au même <img src=" title="Smile" />.

Autre question : Est-il possible de faire de sous-sous-paragraphes ?
Member
Messages : 138
Date d'inscription : 2008-04-09
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Tue 15 Jun - 22:42
bien sûr :
tu peux faire autant de sous-sous-sous-sous-(etc...)-sous-paragraphes que tu veux avec les instructions "lis" et "ferme".
Par contre, pour garder un livre clair, n'oublie d' indenter le livre ..
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 10:09
Voici ma proposition :
Code:
Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre
Actions :

demande e
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
affiche durée
termine
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 10:15
Avec 0, j'ai une boucle infinie !
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 11:59
Un exemple avec une imbrication de sous-paragraphes. Il affiche les solutions à cet algorithme pour les entiers de 1 à 1000 :
Code:
Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre valant 1
b est un nombre valant 1
Actions :

tant que b est plus petit que 1001, lis
e vaut b
durée vaut 0
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
affiche "Si l'entier vaut " + b + ", alors la durée est :
" + durée
b vaut b + 1
Ferme
termine
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 12:12
Un autre exemple !
Cette fois-ci, ce livre calcule la durée maximum trouvé entre 1 et 10000 :
Code:
Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre valant 1
b est un nombre valant 1
e_max est un nombre vide
durée_max est un nombre vide
Actions :

tant que b est plus petit que 10001, lis
e vaut b
durée vaut 0
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
Si durée est plus grand que durée_max alors lis
e_max vaut b
durée_max vaut durée
Ferme
b vaut b + 1
Ferme
affiche "Si l'entier vaut " + e_max + ", alors la durée vaut :
" + durée_max
termine
Member
Messages : 138
Date d'inscription : 2008-04-09
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 13:08
même si ce n'est pas obligatoire, on peut aussi faire par récursion:

Code:
syracuse récursif :


entrée :

rôles :

n est un nombre
actions :

demande n
n = abs( arrondi( n )) ("pour s'assurer qu'il s'agit bien d'un entier positif ")
parcours syracuse avec n
affiche "la durée du vol est " + n
termine

syracuse :

rôles :

*x est un nombre
actions :

si arrondi(x / 2) est égal à (x / 2) alors x = x / 2
sinon , x = 3 * x + 1
si x est plus grand que 1 alors parcours syracuse avec x
sinon , x = 0
x = x + 1
reviens
Member
Messages : 121
Date d'inscription : 2010-05-15
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 13:15
Oula, ça part sur du compliquer Surprised. C'est sympa <img src=" title="Smile" />

Voila où j'en étais pour le "1 paragraphe" :

Code:
Livre :
Saute éléphant

Paragraphe :
Tell me more ("Grease power")
Les rôles :

cristal & émeraude & diamant est un nombre
rubis est un texte valant "La durée de vol est de "
Les actions :

Tu questionnes le cristal sur "Choisis un nombre strictement superieur à 1 =) !"
Le diamant vaut le cristal/2
Le diamant vaut décimal diamant
Si le cristal est égal à 1 alors tu lis
Tu ajoutes l'émeraude dans le rubis
Tu affiches le rubis
Tu termines
Tu fermes
Sinon, tu lis
Si le diamant est égal à 0 alors tu lis
Le cristal vaut le cristal/2
L'émeraude vaut l'émeraude+1
Tu fermes
Sinon, tu lis
Le cristal vaut 3*cristal+1
L'émeraude vaut l'émeraude+1
Tu fermes
Tu vas vers Tell me more
Mais l'atelier surligne "Sinon, tu lis" et me dit que "La structure du sous-paragraphe est incorrecte".

Où est mon erreur ?
Member
Messages : 138
Date d'inscription : 2008-04-09
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 13:29
rien de grave :
c'est juste que le dernier sous-paragraphe n'est pas refermé.
il faut que tu ajoutes "tu fermes" à la fin de ton livre.




.
Member
Messages : 121
Date d'inscription : 2010-05-15
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 16:01
Ha, oui... Merci :p !
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 16:41
[quote=cpc]Avec 0, j'ai une boucle infinie ![/quote]
Effectivement, j'aurais dû préciser que l'entier de départ était supérieur ou égal à 1...
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Wed 16 Jun - 16:48
Je ne pense pas que le programme "Saute éléphant" puisse fonctionner tel quel, parce que l'ordinateur va redemander l'entier à chaque fois qu'on reprend le paragraphe.

Si on ne veut pas utiliser l'instruction "Tant que", je pense que deux paragraphes sont nécessaires : un pour demander l'entier, l'autre pour calculer la durée de vol.

La solution de Ronan est celle à laquelle je pensais, mais celle de $imon ne manque pas d'élégance...
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[simple-moyen] Suite de Syracuse

le Fri 18 Jun - 9:20
J'ai un doute sur la méthode récursive. Je me demande si la suite de Syracuse si prête ! Mais je ne sais pas le prouver mathématiquement...
Member
Messages : 52
Date d'inscription : 2009-10-01
Voir le profil de l'utilisateur

[simple-moyen] Suite de Syracuse

le Fri 18 Jun - 10:35
Si si ça marche très bien, je l'ai testée.

Au fait, comment fait-on pour modifier le titre du topic (pour préciser qu'il est résolu) ?
Contenu sponsorisé

Re: [simple-moyen] [résolu] Suite de Syracuse

Voir le sujet précédentRevenir en hautVoir le sujet suivant
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum