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 自体の書き方は変わらないですね。