Comece agoraComece grátis

Interrompendo um laço for

Às vezes, você pode querer sair de um laço antes de concluir todas as iterações. Por exemplo, seu código pode atingir o objetivo antes de testar todas as possibilidades. A palavra-chave break pode ser usada para interromper um laço mais cedo.

O padrão de código fica assim:

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

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

  // Otherwise carry on as usual
}

Aqui você vai refazer o exemplo anterior para que o laço pare quando o valor não mudar muito (com base em um limite). A função foi modificada para retornar uma List (você vai aprender sobre Lists no próximo capítulo), permitindo ver a aproximação em cada iteração.

Esta versão modificada de sqrt_approx() retorna a raiz quadrada e o número de iterações necessárias para alcançar esse resultado com base no limite.

Este exercicio faz parte do curso

Otimizando código R com Rcpp

Ver curso

Instruções do exercicio

Adicione uma condição de interrupção que dispare se a solução estiver boa o suficiente (com base na variável is_good_enough).

exercicio interativo prático

Tente este exercicio completando este código de exemplo.

#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 e Executar Código