ComenzarEmpieza gratis

Salir de un bucle for

A veces puede que quieras salir de un bucle antes de completar todas las iteraciones. Por ejemplo, tu código puede lograr su objetivo antes de probar todas las posibilidades. La palabra clave break se usa para salir de un bucle antes de tiempo.

El patrón de código tiene este aspecto:

for(int i = 0; i < n; i++) {
  // Do something

  // Test for exiting early
  if(breakout_condition) break;

  // Otherwise carry on as usual
}

Aquí vas a adaptar el ejemplo anterior para que el bucle se detenga cuando el valor no cambie demasiado (según un umbral). La función se ha modificado para que devuelva una List (aprenderás sobre las Lists en el próximo capítulo), lo que te permitirá ver la aproximación en cada iteración.

Esta función sqrt_approx() modificada devuelve tanto la raíz cuadrada como el número de iteraciones que hizo falta para conseguir este resultado según el umbral.

Este ejercicio forma parte del curso

Optimizar código de R con Rcpp

Ver curso

Instrucciones del ejercicio

Añade una condición de ruptura que se active si la solución es suficientemente buena (basada en la variable is_good_enough).

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

#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)
*/
Editar y ejecutar código