無題

問題設定はnを1から初めてその2乗を足していき、和が2000を初めて超えたとき和はいくつになるかという問題を考えます。通常の、C++ 言語で考えれば以下のようになるでしょうか。

んー、次のどっちかかなあ:

template <bool cont = true, int x = 1, int sum = 0>
struct hoge
{
    static const int value = hoge<sum + x * x < 2000, x + 1, sum + x * x>::value;
};

template <int x, int sum>
struct hoge<false, x, sum>
{
    static const int value = sum;
};

int main(int argc, char* argv[])
{
    int sum = 0;
    for (int i = 1 ; sum < 2000 ; sum += i*i, ++i);

    assert( hoge<>::value == sum );

    return 0;
}

ループと再帰はすぐ書けるけど、無限集合を舐めていくようなやり方は、確かにC++単体だとなかなか思いつかないですねえ…。