IniziaInizia gratis

Uscire da un ciclo for

A volte potresti voler uscire da un ciclo prima di aver completato tutte le iterazioni. Per esempio, il tuo codice potrebbe raggiungere l'obiettivo prima di aver provato tutte le possibilità. La parola chiave break permette di interrompere un ciclo in anticipo.

Il modello di codice è il seguente:

for(int i = 0; i < n; i++) {
  // Fai qualcosa

  // Verifica se uscire in anticipo
  if(breakout_condition) break;

  // Altrimenti prosegui normalmente
}

Qui rielaborerai l'esempio precedente in modo che il ciclo si fermi quando il valore non cambia troppo (in base a una soglia). La funzione è stata modificata per restituire una List (imparerai le List nel prossimo capitolo), così puoi vedere l'approssimazione a ogni iterazione.

Questa versione modificata di sqrt_approx() restituisce sia la radice quadrata sia il numero di iterazioni necessarie per ottenere il risultato in base alla soglia.

Questo esercizio fa parte del corso

Ottimizzare il codice R con Rcpp

Visualizza il corso

Istruzioni dell'esercizio

Aggiungi una condizione di interruzione che scatta se la soluzione è sufficientemente buona (in base alla variabile is_good_enough).

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

#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)
*/
Modifica ed esegui il codice