|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() kevin lhommeÉtudiant Inscription : décembre 2011 Messages : 3 ![]() |
Bonjour le forum,
pouvez vous m'aide a trouve une formule ou une methode pour rendre cette boucle plus rapide,merci d'avance pour vos reponses. Code :
|
||
|
|
00
|
|
|
#2 | |||
|
Expert Confirmé Sénior
![]() Jérôme FONTAINEContrôleur de Gestion Inscription : juin 2006 Messages : 3 920 ![]() |
Bonjour,
J'utiliserais une boucle do While plutôt que des goto Et pour une meilleur lisibilité, travail la mise en forme du code Code :
__________________
Jérôme Citation:
nous encouragera.Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
|
|||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() kevin lhommeÉtudiant Inscription : décembre 2011 Messages : 3 ![]() |
merci beaucoup pour votre reactivité,mais j'ai dejas essayé cette methode.
en terme de vitesse c'est pas encore ça! |
|
|
00
|
|
|
#4 | ||
|
Futur Membre du Club
![]() Jean-Francis BARREAUDDéveloppeur informatique Inscription : juin 2011 Messages : 22 ![]() |
Bonjour,
Comme le suggère jlfontaine, le fait de 'boucler' au lieu de revenir par goto rend le code plus intelligible... mais malheureusement ne risque pas d'améliorer le temps d'exécution Le temps d'exécution va dépendre essentiellement du nombre d'opérations et d'affectations réalisées, et je ne vois pas trop où se situerait le gain. Il faudrait essayer de transformer la logique de ton traitement et le choix des variables. Tu es le mieux placé pour ça. A priori, tu pourrais essayer de ne faire que compter le nombre de fois où tu reviens sur chacun des tests, puis ensuite faire les soustractions en une seule opération, du moins pour les si. Pour le reste, c'est un peu un casse-tête, mais, il faudrait voir si les décrémentations successives de p1,p2,etc ne peuvent pas être traduites globalement par une formule sur les résultats (on a des suites récurrentes, en fait). Code :
|
||
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Jean-Francis BARREAUDDéveloppeur informatique Inscription : juin 2011 Messages : 22 ![]() |
Je continue: dans le précédent post j'indiquais comment supprimer les incrémentations des si
si tu conserves les valeurs initiales des Pi, par exemple Q1,Q2,Q3,Q4 tu admets facilement qu' à la fin de la boucle, P4 =Q4-n sous la forme d'un suite: P4(0)=Q4, P4(1)=P4(0)-1=Q4-1, P4(2)=P4(1)-1=Q4-2, ... on peut écrire P4(n)=p4(0)-n et donc P4=Q4-n ( pour tester ton algorithme, tu conserves le calcul initial afin de comparer à la sortie, et dans un premier temps on utilise Q4 tant que P4 varie) donc en fin de boucle on peut calculer P4... A ce stade on ne peut pas enlever la ligne P4=P4-1 car tu t'en sers dans les autres calculs (P3=P3-P4) Mais si on peut calculer P3 sans calculer P4 à chaque fois, tu peux supprimer une instruction dans la boucle. P3(n)=p3(n-1)-P4(n-1) p3(n)=p3(n-2)-p4(n-2)-p4(n-1) à la fin de la boucle: p3(n)=p3(0) - Somme(i=1 à n-1)[p4(i)] Somme(i=1 à n-1) [P4(i)]= p4(1) + ... P4(n-1) = (p4(0)-1) + (p4(0)-2) + (p4(0)-3) + ... + (p4(0) - (n-1)) = n*p4(0) - (1 +2+...+(n-1)) On peut calculer en une instruction la somme (1+2+...+n): si n est pair, c'est n*(n+1)/2 sinon c'est n+ (n*(n-1)/2) donc ici, en allant jusqu'à (n-1): P3(n)= p3(0) - (n-1)*p4(0) + S si n= est pair : S= n*(n-1)/2 sinon: S= (n-1)+ (n-1)*(n-2)/2 Je crois donc que tu peux calculer P1,P2,P3,P4 à tout moment, selon n Finalement: dans ta boucle tu conserves simplement le calcul de n, puis de P1(n), puis de nx, afin de pouvoir faire le test... et à la sortie tu calcules tous les autres paramètres. J'ai voulu tester le calcul de P3 mais il y a une petite erreur : il faut certainement réfléchir un peu à la position de (n=n+1) dans la boucle (avant ou après les calculs), pour savoir de façon rigoureuse si c'est n ou n-1 la limite des sommes récurrentes... En tout cas le principe est d'écrire ça sous forme de suites et de transformer les 'Sommes de 1 à n' en formules ... |
|
|
00
|
|
|
#6 | ||
|
Futur Membre du Club
![]() Jean-Francis BARREAUDDéveloppeur informatique Inscription : juin 2011 Messages : 22 ![]() |
Je pensais m'arrêter là, mais je suis vraiment un vrai malade. Ton problème m'excite... j'ai donc voulu finir le premier test.
En fait la formule pour calculer P3 est bien: si n est pair: P3=Q3 - n*Q4 + n*(n-1)/2 si n est impair: P3=Q3 - n*Q4 +(n-1)+ (n-1)*(n-2)/2 Je te donne le code de mon test, pour la première boucle: sur la ligne 4 les résultats du calcul intitial, sur la ligne 5 les résultats du calcul, en sortant l'instruction P4=P4-1 et en remplaçant P3=P3-P4 par le calcul direct de P3 selon n Code :
|
||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() kevin lhommeÉtudiant Inscription : décembre 2011 Messages : 3 ![]() |
bonjour orpheu,
merci beaucoup pour ton investissement ,j'ai pas tous bien comprie mais cela marche tres bien cordialement kevin. |
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Jean-Francis BARREAUDDéveloppeur informatique Inscription : juin 2011 Messages : 22 ![]() |
J'accepte tes remerciements, car c'est vrai que j'y ai consacré pas mal de temps... mais ce sont les joies de notre métier: des problèmes à régler... et le plaisir de trouver.
Tu me dis que ça marche, mais que tu n'as pas tout compris. Mais attention, tu n'auras des résultats sur le temps d'exécution final que si tu poursuis la démarche. Dans la programmation, il faut parfois investir beaucoup de temps au départ pour en regagner à l'exécution.. à condition que le programme soit destiné à être exécuté, car sinon, il vaut mieux ne pas trop se casser la tête et laisser l'ordinateur travailler, le temps qu'il faut. Donc, si tu souhaites poursuivre, et que tu n'y arrives pas, n'hésite pas à te manifester ici... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com