for ループからの脱出(break)
ときには、すべての反復が終わる前にループを抜けたいことがあります。たとえば、すべての可能性を試す前に目的が達成できる場合です。break キーワードを使うと、ループを途中で抜けられます。
コードのパターンは次のとおりです。
for(int i = 0; i < n; i++) {
// Do something
// Test for exiting early
if(breakout_condition) break;
// Otherwise carry on as usual
}
ここでは、値の変化が小さくなった時点(しきい値に基づく)でループが止まるように、前の例を作り直します。関数は List を返すように変更されています(List については次の章で学びます)。これにより、各反復での近似値を確認できます。
この変更後の sqrt_approx() 関数は、平方根と、そのしきい値に基づいて結果に到達するまでにかかった反復回数の両方を返します。
この演習はコースの一部です
Rcpp で R コードを最適化する
演習の手順
解が十分良い場合(変数 is_good_enough に基づく)に発火する break 条件を追加してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
#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)
*/