Avbryta en for-slinga i förtid
Ibland vill du avsluta en slinga innan alla iterationer har körts klart. Det kan till exempel hända att koden löser uppgiften innan alla möjligheter har testats. Nyckelordet break används för att avbryta en slinga i förtid.
Mönstret ser ut så här:
for(int i = 0; i < n; i++) {
// Do something
// Test for exiting early
if(breakout_condition) break;
// Otherwise carry on as usual
}
Här ska du göra om det tidigare exemplet så att slingan stannar när värdet inte förändras tillräckligt mycket (baserat på ett tröskelvärde). Funktionen har ändrats så att den returnerar en List (du lär dig mer om List i nästa kapitel), vilket gör att du kan se approximationen vid varje iteration.
Den modifierade funktionen sqrt_approx() returnerar både kvadratroten och antalet iterationer som krävdes för att nå resultatet baserat på tröskelvärdet.
Den här övningen är en del av kursen
Optimera R-kod med Rcpp
Övningsinstruktioner
Lägg till ett avbrottsvillkor som aktiveras om lösningen är tillräckligt bra (baserat på variabeln is_good_enough).
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
#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)
*/