Uit een for-loop breken
Soms wil je een loop eerder verlaten, voordat alle iteraties klaar zijn. Bijvoorbeeld wanneer je code de taak al voltooit voordat alle mogelijkheden zijn geprobeerd. Het sleutelwoord break kun je gebruiken om een loop vroegtijdig te stoppen.
Het patroon ziet er zo uit:
for(int i = 0; i < n; i++) {
// Do something
// Test for exiting early
if(breakout_condition) break;
// Otherwise carry on as usual
}
Hier ga je het vorige voorbeeld aanpassen zodat de loop stopt wanneer de waarde niet meer te veel verandert (gebaseerd op een drempelwaarde). De functie is aangepast zodat hij een List teruggeeft (je leert in het volgende hoofdstuk meer over Lists), zodat je de benadering bij elke iteratie kunt zien.
Deze aangepaste functie sqrt_approx() retourneert zowel de vierkantswortel als het aantal iteraties dat nodig was om dit resultaat te behalen op basis van de drempel.
Deze oefening maakt deel uit van de cursus
R-code optimaliseren met Rcpp
Oefeninstructies
Voeg een break-voorwaarde toe die afgaat als de oplossing goed genoeg is (gebaseerd op de variabele is_good_enough).
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
#include
using namespace Rcpp;
// [[Rcpp::export]]
List sqrt_approx(double value, int n, double threshold) {
double x = 1.0;
double previous = x;
bool is_good_enough = false;
int i;
for(i = 0; i < n; i++) {
previous = x;
x = (x + value / x) / 2.0;
is_good_enough = fabs(previous - x) < threshold;
// If the solution is good enough, then "break"
___(___) ___;
}
return List::create(_["i"] = i , _["x"] = x);
}
/*** R
sqrt_approx(2, 1000, 0.1)
*/