Quitter une boucle for
Il arrive que vous souhaitiez quitter une boucle avant d'avoir terminé toutes les itérations. Par exemple, votre code peut réussir sa tâche avant d'avoir essayé toutes les possibilités. Le mot-clé break permet de sortir d'une boucle plus tôt.
Le modèle de code ressemble à ceci :
for(int i = 0; i < n; i++) {
// Do something
// Test for exiting early
if(breakout_condition) break;
// Otherwise carry on as usual
}
Ici, vous allez retravailler l'exemple précédent pour que la boucle s'arrête lorsque la valeur ne change pas trop (selon un seuil). La fonction a été modifiée pour qu'elle retourne une List (vous verrez les Lists au prochain chapitre), ce qui vous permet d'observer l'approximation à chaque itération.
Cette version modifiée de sqrt_approx() retourne à la fois la racine carrée et le nombre d'itérations nécessaires pour obtenir ce résultat en fonction du seuil.
Cette activité fait partie du cours
Optimiser le code R avec Rcpp
Instructions de l’exercice
Ajoutez une condition d'arrêt qui se déclenche si la solution est suffisamment bonne (selon la variable is_good_enough).
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
#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)
*/