Boost.Phoenix でフィボナッチ数列
メモ化していないので実行速度は遅いですが。
[ソース]
#include <boost/phoenix/core.hpp> #include <boost/phoenix/bind.hpp> #include <boost/phoenix/operator.hpp> #include <boost/phoenix/scope.hpp> #include <boost/function.hpp> #include <boost/range/irange.hpp> #include <boost/range/algorithm/for_each.hpp> #include <iostream> int main(){ namespace phx = boost::phoenix; using phx::arg_names::arg1; using phx::local_names::_n; boost::function<unsigned long int(unsigned long int)> fibonacci; fibonacci = phx::let(_n = arg1)[ phx::if_else(_n == 0, 0, phx::if_else(_n == 1, 1, phx::bind(phx::ref(fibonacci), _n - 1) + phx::bind(phx::ref(fibonacci), _n - 2) )) ]; boost::for_each(boost::irange(1, 30), std::cout << phx::bind(fibonacci, arg1) << std::endl ); return 0; }
[出力]
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229
先に関数を作っておく必要はありますが、Boost.Phoenix 自体の書き方は変わらないですね。