Zacznij terazZacznij za darmo

Wychodzenie z pętli for przed jej końcem

Czasem zachodzi potrzeba przerwania pętli przed zakończeniem wszystkich iteracji – na przykład gdy kod wykona swoje zadanie, zanim zostaną sprawdzone wszystkie możliwości. Słowo kluczowe break pozwala wyjść z pętli wcześniej.

Schematyczny zapis wygląda tak:

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

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

  // Otherwise carry on as usual
}

W tym ćwiczeniu przerobisz poprzedni przykład tak, aby pętla zatrzymywała się, gdy wartość przestaje się znacząco zmieniać (na podstawie wartości progowej). Funkcja została zmodyfikowana i zwraca teraz obiekt List (o listach dowiesz się więcej w następnym rozdziale), dzięki czemu możesz śledzić przybliżenie na każdej iteracji.

Zmodyfikowana funkcja sqrt_approx() zwraca zarówno pierwiastek kwadratowy, jak i liczbę iteracji potrzebnych do osiągnięcia wyniku na podstawie wartości progowej.

To ćwiczenie jest częścią kursu

Optymalizacja kodu R za pomocą Rcpp

Zobacz kurs

Instrukcje do ćwiczenia

Dodaj warunek przerwania pętli, który zostanie wyzwolony, gdy rozwiązanie będzie wystarczająco dokładne (na podstawie zmiennej is_good_enough).

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

#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)
*/
Edytuj i uruchom kod