vu que t'as probablement fini ton exo?
quelques remarques plus d'ordre logiciel:
1)
dans ton ecriture:
- Code: Tout sélectionner
if ..
return A
else
return B
généralement tu as deux ecoles:
- Code: Tout sélectionner
if ..
res = A
else ..
res = B
return res
(c'est un flamewar donc t'auras les pros&cons sur le net. Grossierement:
comme tu as qu'un seul return, tu es sûr (par exemple avec ton cache, de pas rater une instruction, alors qu'avec ton approche tu duppliques une ligne)
ou
- Code: Tout sélectionner
if ..
return A
return B
ici tu t'évites des indentations inutiles mais par exemple avec ton cache t'es obligé de l'écrire dans le if et apres
donc de pref choisis l'un ou l'autre, mais un return dans un if et un return dans un else... c'est cumuler les inconvénients des deux!
2) dans l'implementation (c'est un peu de ma faute aussi) tu vois que tu as que des i+1 partout (sauf la condition d'arret ou i = len(c)-1
donc au final c'est comme si t'avais que des i, et que t'appelais ta fonction avec iInitial+1 (au lieu de iInitial) idem 0 au lieu de -1
C'est mieux pour plusieurs raisons:
- tu evites une etourderie en oubliant un +1 qqpart
- ton contrat de fonction est plus naturel: tu appel rectopdown(0) avec 0 directement l'index (c'est un peu plus intuitif...)
3) tjs avec contrat de fonction, rectopdown appartient à une classe. donc quitte à avoir une classe, autant la construire avec a,b,t,c et track
et simplifier rectopdown avec juste en argument (i, lastVisited)
4) plutot d'ordre algorithmique:
si tu as la suite de symboles (donc tous différents)
ABCDFEG
si tu visites A,B tu calcules rectopdown(2, 'B')
si tu visites A, skip B, tu vas aussi calculer rectopdown(2,'A')
et tu auras storé dans ton cache (2,'B') et (2,'A') alors que la somme est forcément la meme.
donc c'est un peu dommage, pe vois-tu comment faire mieux?
5) en etant "factorisant au max", on peut ecrire
- Code: Tout sélectionner
if ..in track
return ..
nopickup = rectoprown(i, lastvisited)
rec_pickup = rectoprown(i, c(i))
if c(i)==lastvisited
pickup = rec_pickup + self.A*T(i)
else
pickup = rec_pickup + self.B*T(i)
maxi = max(nopickup, pickup)
track[(..)] = maxi
return maxi
ce qui te fait quelques ligne de moins à taper (et surtout moins de pblms liés au copier coller)
et soit dit en passant te fait respecter la marge des 80c