我正在尝试通过Y组合子在C++中编写递归而不引用函数名称。然而,我无法弄清楚以下尝试中函数的类型:
#include <iostream>
using std::cin;
using std::cout;
template<class Function> unsigned long factorial1(Function self, unsigned long n) {
return n ? n * self(self, n - 1) : 1;
}
unsigned long factorial(unsigned long n) {
return factorial1(factorial1, n);
}
int main() {
unsigned long n;
cin >> n;
cout << factorial(n) << '\n';
return 0;
}
编译器无法推断出什么是Function
,我也不知道。然后我尝试了以下方法:
#include <iostream>
using std::cin;
using std::cout;
struct Factorial {
template<class Function> unsigned long operator()(Function self, unsigned long n) const {
return n ? n * self(self, n - 1) : 1;
}
};
unsigned long factorial(unsigned long n) {
return Factorial()(Factorial(), n);
}
int main() {
unsigned long n;
cin >> n;
cout << factorial(n) << '\n';
return 0;
}
相比上面的例子,不同之处在于我将工作函数更改为可调用对象,其中Function
很容易被推导为Factorial
,从而导致组合体的完整实现如下:
#include <iostream>
using std::cin;
using std::cout;
struct Factorial {
template<class Function> unsigned long operator()(Function self, unsigned long n) const {
return n ? n * self(self, n - 1) : 1;
}
};
template<class Function> auto y(Function f) {
return [f](auto n) {
return f(f, n);
};
}
int main() {
unsigned long n;
cin >> n;
cout << y(Factorial())(n) << '\n';
return 0;
}
问题是,是否可能将结构体Factorial
重写为普通函数?
factorial1
是一个模板?如果不是factorial1
,self
可能是什么呢? - Christian Hacklstd :: uintptr_t
,并在必要时进行转换...(顺便说一句:对此评论不做任何保证。) - davidbak