CommencerCommencer gratuitement

Interrompre une boucle for

Il arrive que vous souhaitiez sortir d’une boucle avant d’avoir terminé toutes les itérations. Par exemple, votre code peut atteindre son objectif avant d’avoir testé toutes les possibilités. Le mot-clé break permet d’interrompre une boucle de manière anticipée.

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 plus beaucoup (selon un seuil). La fonction a été modifiée pour renvoyer une List (vous verrez les List au chapitre suivant), ce qui vous permet d’observer l’approximation à chaque itération.

Cette version modifiée de sqrt_approx() renvoie à la fois la racine carrée et le nombre d’itérations nécessaires pour atteindre ce résultat en fonction du seuil.

Cet exercice fait partie du cours

Optimiser du code R avec Rcpp

Afficher le cours

Instructions

Ajoutez une condition d’arrêt qui se déclenche si la solution est suffisamment bonne (d’après la variable is_good_enough).

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

#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)
*/
Modifier et exécuter le code