Einen for-Loop abbrechen
Manchmal möchtest du eine Schleife beenden, bevor alle Iterationen durchlaufen sind. Zum Beispiel kann dein Code die Aufgabe schon vor dem Ausprobieren aller Möglichkeiten erfolgreich abschließen. Mit dem Schlüsselwort break kannst du eine Schleife frühzeitig verlassen.
Das Muster sieht so aus:
for(int i = 0; i < n; i++) {
// Do something
// Test for exiting early
if(breakout_condition) break;
// Otherwise carry on as usual
}
Hier überarbeitest du das vorherige Beispiel so, dass die Schleife stoppt, wenn sich der Wert nicht mehr zu stark ändert (basierend auf einem Schwellwert). Die Funktion wurde so angepasst, dass sie eine List zurückgibt (du lernst Lists im nächsten Kapitel kennen), sodass du bei jeder Iteration die Näherung sehen kannst.
Diese angepasste Funktion sqrt_approx() gibt sowohl die Quadratwurzel als auch die Anzahl der Iterationen zurück, die basierend auf dem Schwellwert für das Ergebnis benötigt wurden.
Diese Übung ist Teil des Kurses
R-Code mit Rcpp optimieren
Anleitung zur Übung
Füge eine Abbruchbedingung hinzu, die ausgelöst wird, wenn die Lösung gut genug ist (basierend auf der Variablen is_good_enough).
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
#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)
*/