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
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)
*/