2013-03-01 85 views
0

可以使用boost :: lambda 递归Boost lambda递归?

这并不编译:

using namespace boost::lambda; 

auto factorial = (_1 == 0) ? 1 : factorial(_1-1); 

是否有建议的解决方法?

编辑:关于使用C++ 11 lambda表达式:下面的VS2012不能编译:

std::function<int(int)> factorial; 
factorial = [&factorial](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 

ANOTHER编辑:奇怪的是,这一个正常工作:

std::function<int(int)> factorial = 
    [&](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 
+1

如果您已经使用C++ 11,为什么不使用'std :: function'和一个内置的递归lambda? http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – 2013-03-01 18:47:53

+0

boost :: lambda似乎有点稳定和灵活,然后msvc C++ 11 lambda实现... – 2013-03-01 18:53:01

+0

什么问题您是否正在使用lambda表达式的VC++实现?我已经使用它们很多,没有看到任何问题(好吧,自SP1以来没有问题)。 – Ferruccio 2013-03-01 18:57:23

回答

0

最简单的方法我用常规的C++ 11 lambda表达式发现的是声明将首先包含lambda的变量,然后定义它并创建lambda表达式。已经声明允许声明在定义/ lambda本身中使用。例如:

std::function<int (int)> factorial = nullptr; 
factorial = [](int x) -> int { 
    if (x <= 1) { 
     return 1; 
    } else { 
     return (x * factorial(x-1)); 
    } 
}; 

到目前为止,我还没有与该方法的任何问题,但你必须知道声明的签名,我不知道是否与工作的boost ::拉姆达(我会这样假设?)。

+0

这不是递归的;如果你这样做,它不会编译(VS2012) – 2013-03-01 19:56:04

+0

这个例子不是,我会解决这个问题。它(或类似的东西,我没有访问一个合适的编译器atm)肯定会编译,我经常使用它。 – ssube 2013-03-01 22:09:41

1

Lambda函数不能直接调用自己,因为它们没有名称。

解决方法很简单:使用命名函数。

+0

不完全正确 - 如果要获取lambda函数指针的基地址,理论上可以将其转换为适当的类型,然后将其称为递归。虽然可能不值得花钱。 – 2013-03-01 18:52:16