Aan de slagGa gratis aan de slag

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

Cursus bekijken

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)
*/
Code bewerken en uitvoeren