Comment fait-on pour "isoler" dans une séquence quelconque de nombres, les sous séquences croissantes?
Par exemple, dans cette séquence: 1 2 3 4 2 3 4 5; il y a 6(six) "augmentations" mais seulement 2(deux) (sous) séquences croissante.
Merci.
Comment fait-on pour "isoler" dans une séquence quelconque de nombres, les sous séquences croissantes?
Par exemple, dans cette séquence: 1 2 3 4 2 3 4 5; il y a 6(six) "augmentations" mais seulement 2(deux) (sous) séquences croissante.
Merci.
Si j'ai bien compris ce que tu appelles sous-séquence croissante, les deux dont tu parles sont 1234 et 2345, c'est ça ?
A ce moment là, l'algorithme me parait simple.
Tu parcours la séquence depuis le début, et tu ajoutes dans une séquence temporaire tous les nombres que tu lis tant qu'ils sont supérieurs à ceux déjà lus. Quand la boucle s'arrête, tu sauvegarde la position, la séquence temporaire, réinitialise la séquence temporaire, et tu recommences la boucle depuis la position sauvegardée.
C'est bien ce que tu voulais ?
Tu peux définir une "structure séquence" : {entier debut, entier longueur} et un tableau de "structure séquence"
ensuite ton algo sera comme celà
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 structure sequence tab_seq // tableau des sequences entier num_seq // numéro de la sequence en cours (indice dans le tableau entier deb_seq // debut de la sequence en cours entier i // indice permettant de parcourir la séquence globale de nombres entier val(i) // valeur du nombre d'indice i dans la sequence globale constante entier len_sequence // longueur de la sequence globale // initalisation de l'algo num_seq <- 1 deb_seq <- 1 i <- 2 // on compare au nombre précédant tant que i <= len_sequence faire debut si val (i) < val(i-1) alors debut si i - deb_seq > 1 alors debut tab_seq[num_seq].debut <- deb_seq tab_seq[num_seq].longueur <- i - deb_seq num_seq <- num_seq + 1 fin deb_seq <- i fin i <- i + 1 fin
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Oui, les deux sous séquences sont: 1234 et 2345.
Ceci est un genre d'exercice et la solution était seulement de comparer la variable "précédente" avec la variable "courante"; si "courante" était supérieur à "précédente" alors on incrémente le "compteur".
Or, cette solution, nous donne toute les augmentations et non les sous-séquences croissantes, ce qui ne répond pas à l'énnoncé et donc ne me convient pas.
Depuis, j'ai pensé à faire une évaluation non pas sur deux variables, mais sur trois; par exemple: "ancienne", "précédente", "courante" avec si "précédente" > "ancienne" alors incrémentation du "compteur" mais ensuite si "courante" > "précédente" alors ne rien faire.
Il me semble que cette solution ne soit pas valable non plus, car à chaque décalage ("précédente" devient "ancienne", "courante" devient "précédente") on se retrouve avec le même problème qu'avec la première solution.
Est-il possible donc, d'identifier ces sous-séquences de façon assez simple, comme une (ou plusieurs) comparaison de variable?
Je vous rappelle que je suis débutant et souhaite juste avoir une solution assez simple à mettre en oeuvre mais qui réponde tout de même au problème, ce qui n'était pas le cas de la solution de correction de l'exercice.
relis bien les deux réponses qui t'ont été donnée, car il me semble qu'elles te donnent bien les sous-séquences, et non seulement les "augmentations":
une séquence peut etre définie par 2 nombres: le premier et le dernier.
la plus petite séquence possible contient un seul nombre: premier=dernier.
au début, tu mets: premier=derniert=le premier nombre de ta séquence:
a chaque pas, tu regarde si le nombre suivant est plus grand que le dernier. si oui, tu dis que c'est le dernier. si non, tu termines ta séquence:1 2 3 4 2 3 4 5
premier=1
dernier=1
1 2 3 4 2 3 4 5
2>1? oui! on change le dernier:
premier=1
dernier=21 2 3 4 2 3 4 5
3>2? oui! on change le dernier:
premier=1
dernier=31 2 3 4 2 3 4 5
4>3? oui! on change le dernier:
premier=1
dernier=4en effet, ta premiere séquence commence à 1, et se termine a 4.1 2 3 4 2 3 4 5
2>4? NON! c'est la fin de ta séquence!
premier=1
dernier=4
ensuite tu cherche la sequence suivante en posant que le nouveau premier est le nombre qui suit immédiatement le dernier, et le nouveau dernier idem.
si ça ne te suffit pas d'avoir le premier et le dernier mais que tu veux toute la séquence, alors il faut définir de quelle façon tu la veux. si c'est une liste, p.ex, a chaque fois que tu as un OUI, avant de redéfinir "dernier", tu ajoutes dernier à ta liste.
Oui, j'avais bien lu les solutions proposées qui effectivement répondent au problème.
Mais je me suis mal exprimé lorsque j'ai parlé de "solution" car je parlais en fait de la solution (correction) que j'avais sur papier de cet exercice; comme ce n'est peut-être toujours pas très clair: j'avais cet exercice imprimé sur papier et la solution que je décris également sur papier.
En tout cas, votre illustration m'a permis de mieux comprendre le mécanisme décris dans les deux précédents messages, merci.
Partager