Bonjour,
Je dois coder en Python un programme qui prend en entrée un tableau u non trié de longueur n et qui me renvoie la plus longue sous-suite croissante. Voici le sujet :
Bonsoir,
Au lieu d'une fonction longueurMax(u), j'aurais programmé une fonction
idxLongueurMax(m) qui aurait renvoyé l'indice de la plus longue sous-suite
ce qui aurait donné directement la plus longue sous-suite.
Voici ce que cela donne en QB64:
CONST BorneA = 10
CONST BorneB = 20
CONST nbU = 15
DIM SHARED u(nbU) AS INTEGER, ssc(nbU) AS INTEGER, x AS INTEGER
CLS
CALL Init
PRINT SeeU$
CALL tabLongMax
PRINT SeeSsc$
x = ssc(idxlongMax%)
PRINT ssc(x)
PRINT SeeOneSsc$(x)
END
SUB Init
SHARED u() AS INTEGER
DIM i AS INTEGER
RANDOMIZE TIMER
FOR i = 0 TO nbU - 1
u(i) = BorneA + INT(RND * (BorneB - BorneA + 1))
NEXT i
END SUB
FUNCTION idxlongMax%
SHARED ssc() AS INTEGER
DIM ret AS INTEGER, i AS INTEGER
ret = 0
FOR i = 1 TO nbU - 1
IF ssc(ret) < ssc(i) THEN
ret = i
END IF
NEXT i
idxlongMax% = ret
END FUNCTION
SUB tabLongMax
SHARED ssc() AS INTEGER
DIM i AS INTEGER
FOR i = 0 TO nbU - 1
ssc(i) = SscLong%(i)
NEXT i
END SUB
FUNCTION SscLong% (p AS INTEGER)
SHARED u() AS INTEGER
DIM i AS INTEGER, n AS INTEGER
n = 1
FOR i = p TO 1 STEP -1
IF u(i - 1) > u(i) THEN
EXIT FOR
END IF
n = n + 1
NEXT i
SscLong% = n
END FUNCTION
FUNCTION SeeOneSsc$ (p AS INTEGER)
SHARED u() AS INTEGER, ssc() AS INTEGER
DIM f AS STRING, i AS INTEGER, j AS INTEGER
f = ""
i = p
f = f + "(" + STR$(i) + ")" + STR$(u(i)) + "[" + STR$(ssc(i)) + "]:"
FOR j = ssc(i) TO 1 STEP -1
f = f + STR$(u(1 + i - j)) + "|"
NEXT j
f = f + CHR$(13)
SeeOneSsc$ = f
END FUNCTION
FUNCTION SeeSsc$
SHARED u() AS INTEGER, ssc() AS INTEGER
DIM f AS STRING, i AS INTEGER, j AS INTEGER
f = ""
FOR i = 0 TO nbU - 1
f = f + "(" + STR$(i) + ")" + STR$(u(i)) + "[" + STR$(ssc(i)) + "]:"
FOR j = ssc(i) TO 1 STEP -1
f = f + STR$(u(1 + i - j)) + "|"
NEXT j
f = f + CHR$(13)
NEXT i
SeeSsc$ = f
END FUNCTION
FUNCTION SeeU$
SHARED u() AS INTEGER
DIM f AS STRING, i AS INTEGER
f = ""
FOR i = 0 TO nbU - 1
f = f + STR$(u(i)) + "|"
NEXT i
SeeU$ = f
END FUNCTION
sauf étourderie
Si tu sais que la plus longue sous suite est la suite qui termine à et qui a pour longueur
, alors tu sais que c'est la suite qui va de
à
compris.
@fontaine6140 : Je pense qu'en python c'est quand même bien plus simple et clair qu'en QB64
def plssc(u) :
i_max, m_max, m = 0,0,1
for i in range(1,len(u)) :
if m > m_max :
i_max, m_max = i,m
if u[i] >= u[i-1] :
m += 1
else :
m = 1
return u[i_max-m_max+1:i_max+1]
Bonjour LittleFox,
Il est vrai qu'en QB64, il faut chaque fois réinventer la roue. (langage de plus bas niveau, pas de listes ).
Je pense qu'il y a une redondance algorithmique dans les fonctions
1) de recherche des longueurs de listes
2) et plssc(u).
On programme toujours dans le langage que l'on connaît le mieux (1979 sur Tandy modèle I 4k de mem).
Je suis d'accord, il y a redondance mais c'est à mon avis pour approcher la solution pas à pas.
Vu que charmander commence à apprendre les algorithmes par le python je me suis permis de sortir la solution en python ^^.
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :