NoS*_*tAl 17 c++ recursion lambda c++11
这主要是一种单线型问题,出于可读性原因,我通常会将这些代码写成多行.
所以我的问题是我可以在定义它的同一语句中调用递归lambda吗?
所以不是这样的:
int n=3;
function<void(int)> f {[n,&f](int i){if (i>1) { cout << "func(a, "; f(i-1); cout << ")";} else cout << "a";}};
f(n);
Run Code Online (Sandbox Code Playgroud)
n
在定义f的同一行中调用该函数.
Jar*_*d42 14
在一个声明几个变量的声明中;-)
主要不是你想要的:
std::function<void(int)>
f {[&f](int i){
if (i>1) {
std::cout << "func(a, "; f(i-1); std::cout << ")";}
else
std::cout << "a";
}},
dummy((f(3), nullptr));
Run Code Online (Sandbox Code Playgroud)
事实上,你可以.这是一个完整的例子,编译和运行良好g++ -std=c++11
:
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> f = ([&f](int i){ return i?f(i-1)*i:1; }), trash = (std::cout << f(3) << std::endl, f);
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为实际使用它并不是一个好主意:该构造, trash = (..., f)
将用于代码高尔夫或模糊编程竞赛,但不符合我的生产代码标准.
让我一瞥函数式编程世界,人们通常使用组合器来处理递归的lambdas.去年有一项提案(P0200r0)将一个简单的Y-combinator添加到标准库中.
抛开这样做是否是个好主意的问题,这将允许你编写和调用这样的递归lambda:
y_combinator([](auto self, int i){
if (i>1) {
std::cout << "func(a, ";
self(i-1);
std::cout << ")";
} else {
std::cout << "a";
}
})(6);
Run Code Online (Sandbox Code Playgroud)
这里的基本思想是y-combinator是一个高阶函数,它包含一个lambda,它作为第一个参数传递给'本身'.组合器负责将自变量包装为lambda的所有调用.
你可以在coliru尝试一下.
归档时间: |
|
查看次数: |
2001 次 |
最近记录: |