C++の書き方をすっかり忘れていて
template struct hoge<int i> {
なんて書いてしまっていました。どうせなら忘れたまま過しても良かったんでしょうが丁度twitterで1から10までの総和をループを使わずに書くという話が出ていたので、C++を思い出しがてら2種類程書いてみた。
#include <iostream>
#include <numeric>
#include <boost/iterator/counting_iterator.hpp>
using namespace std;
using namespace boost;
template<int i> struct sigma { enum { val = i + sigma<i - 1>::val }; };
template<> struct sigma<1> { enum { val = 1 }; };
int main()
{
cout << accumulate(counting_iterator<int>(1), counting_iterator<int>(11), 0) << endl;
cout << sigma<10>::val << endl;
}
sigmaでいいのかな?一番不安だったのが名前w
※ 余談 (こっちはCです)
次のようにループを使ってもループを使わないソースを生成すればアリらしい(本当か?)
#include <stdio.h>
int main(void)
{
int i;
printf("#include <stdio.h>\n");
printf("int main(void) { printf(\"%%d\\n\",");
for(i = 1; i < 10; i++) {
printf("%d+", i);
}
printf("%d); return 0;}\n", i);
return 0;
}
こいつを実行すると以下のソースを吐くので
#include <stdio.h>
int main(void) { printf("%d\n",1+2+3+4+5+6+7+8+9+10); return 0;}
これを再度コンパイルすればいい。
Shakespeareで書こうと思ったけど気力が足りなかったのでWikipediaに載っていた階乗のソースを改造して作ったHaskellのソースがこちら
main = print $ sigma 10
sigma :: Integer -> Integer
sigma 1 = 1
sigma n | n > 0 = n + sigma (n-1)