Code: Selecteer alles
while (p<=n) p+=p;
Beide while loopjes zijn uiteraard
\({\cal O}(\log(n))\)
.Code: Selecteer alles
while (p<=n) p+=p;
volgens mij zijn compilers wel meestal slim genoeg om recursie om te zetten naar while-lussen.
Dat ligt maar net aan de recursierelatie, ik heb best vaak gezien dat een recursieve oplossing in eerste instantie veel makkelijker lijkt, maar later blijft dat het net zo goed in een loopje kan, zonder alles bij iedere iteratie een keer op de stack te zetten.Waarom zou een compiler dat willen doen? Sowieso moet hij dan meestal de hele zaak omzetten naar een stack systeem, terwijl functieaanroepen sowieso al neer komen op het opvullen van het stackmechanisme in je computer. Of hier echt snelheidswinst valt door te boeken betwijfel ik sterk.
Code: Selecteer alles
public Type Methode (ParameterType1 t1, ParameterType2 t2,...) {
...
if(voorwaarde) {
Methode(f(t1),f(t2),...);
}
}
Code: Selecteer alles
public Type Methode (ParameterType1 t1, ParameterType2 t2,...) {
boolean bool = true;
while(bool) {
...
t1 = f(t1);
t2 = f(t2);
t3 = ...
bool = voorwaarde;
}
}
Ja ok, in sommige simpele gevallen waar de programmeur niet voor de beste code gaat kan het mss wel iets uitmaken. Maar zouden compilers er ook toe in staat zijn om iets complexere recursieproblemen op te lossen met while lussen? Ik vrees er voor. Mijn kennis over compilers is nog vrij beperkt, dus mss kan ik toch nog verbaasd worden door compilertechniekenDat ligt maar net aan de recursierelatie, ik heb best vaak gezien dat een recursieve oplossing in eerste instantie veel makkelijker lijkt, maar later blijft dat het net zo goed in een loopje kan, zonder alles bij iedere iteratie een keer op de stack te zetten.
Natuurlijk kan je dat altijd, maar in bepaalde situaties moet je gewoon het stackmechanisme van je processor nabootsen, en of je dat sneller in software kan dan in hardware (welja hardware...) betwijfel ik.Je kan volgens mij iedere recursie als while schrijven.
Code: Selecteer alles
for(int i = 0; i < 20; i++) {
j += m*n;
}
Code: Selecteer alles
int k = m*n;
for(int i = 0; i < 20; i++) {
j += k;
}
VS haalt heel die for loop weg en maakt er meteen j += 20*m*n vanVladimir Lenin schreef:voorbeeld:
wordt door een compiler meestal vervangen door:Code: Selecteer alles
for(int i = 0; i < 20; i++) { j += m*n; }
Code: Selecteer alles
int k = m*n; for(int i = 0; i < 20; i++) { j += k; }