florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 1 nov. 2005 à 10:52
Sinon , la méthode manuelle serait:
<hr size= "2" width="100%"> function ReverseString(const S: string): string;
var P, P2: Integer;
begin SetLength(Result, Length(S));
P2 : = 1;
for P := Length(S) downto 1 do
begin
Result[P2] : = S[P];
Inc(P2);
end;
end;
<hr size="2" width="100%">Et il y a meme moyen de faire encore plus simple en utilisant la récursivité.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 1 nov. 2005 à 11:46
Ah ouais pas mal, je n'y avais pas pensé.
Ma solution récursive, c'est:
<hr size= "2" width="100%"> function ReverseString(const S: string): string;
begin if S <> '' then
Result : = S[Length(S)] + ReverseString(Copy(S, 1, Length(S) -1));
end;
<hr size="2" width="100%">Pas de variable locale, juste une comparaison. Pour les dingues qui aiment faire au plus court.
@ ++ Flo
Si tu ne te plantes pas ......
tu ne poussera jamais
Vous n’avez pas trouvé la réponse que vous recherchez ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 1 nov. 2005 à 12:10
Après quelques test de performances, je conclue qu'il faut utiliser soit la fonction de l'unite StrUtils soit ma première version.
Celle de WhitteHippo et la mienne version récursive sont 40 fois plus lentes !!!
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 3 nov. 2005 à 01:58
petite explication sur les differences de performances (sans entrer dans le detail)
la 1re méthode est ecrite en assembleur et elle reserve une seule fois l'espace memoire .
2éme methode: florenth elle est assez proche de la 1ere la difference
de performance n'étant quau niveau des appels a des fonctions
suplementaires effectuée 1 seule fois ce n'est pas significatif.
3eme methode (celle de withehippo) elle est pénalisée la l'attribution
a chaque boucle de la mémoire nécessaire (appel aux gestionnaire de tas
--> attribution de memoire -->transfert des
données-->liberation de memoire)
4eme methode (recursive) là ça s'aggrave en plus de l'attribution memoire:
-appel de N fois de la fonction -->occupation de la pile stokage des adresses
- dans la fonction ReverseString pointeur calculé+copy avec position calculée
- depilage des adresses de retour
dans cette methode pour gagner une variable integer de 4 octets tu
perds au minimum 4 octets par appel c'est un victoire à la Pyrrhus.
mais ça fait travailler les neurores et c'est toujours bon
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 3 nov. 2005 à 18:26
ooui j'ai oublié celle de jappee mais comme elle est directement
dérivée de celle de withehippo (inversion du sens de boucle) il est
normal qu'elle donne les mêmes résultats en performance .
je suis sur qu'en creusant un peu on pourrait en trouver d'autres (en passant par l'assembleur par exemple)
au fait pour la méthode récursive l'occupation de la pile est beaucoup
plus importante que 4 octets puisqu'il faut y rajouter la sauvegarde du
contexte (au minimun les registres ) et surtout les passages de
parametres : il me semble que contrairement aux variables ou l'on ne
passe qu'une adresse les constantes sont passées en intégralité par la
pile. gaffe aux débordement de pile.