我在 C# 中使用递归 lambda 并在网络上找到了两种实现此目的的方法。一种方法使用 fixed point combinator而另一个则没有。在下面的代码中,f1 是使用组合器构建的,而 f2 是直接定义的。我的问题是,我们是否需要 C# 中的定点组合器,或者该语言已经提供了我们所需的一切,所以我们可以不用管它们?
class Program
{
static Func<T, T> F<T>(Func<Func<T,T>,Func<T,T>> f)
{
return x => f(F(f))(x);
}
static void Main(string[] args)
{
Func<Func<int,int>,Func<int,int>> f = fac => x => x == 0 ? 1 : x * fac(x - 1);
var f1 = F(f);
Console.WriteLine(f1(5));
Func<int, int> f2 = null;
f2 = x => x == 0 ? 1 : x * f2(x - 1);
Console.WriteLine(f2(5));
}
}
最佳答案
因为我们可以为方法命名,这意味着该语言已经内置了对递归的必要支持。
请注意,您的问题中给出的第二种方法涉及在引入变量后更改变量的值,使其不是“纯”函数式编程。 只有当你的函数微积分系统没有内置的函数概念时,Y 组合器才是必需的,该函数可以在定义完全定义之前通过名称引用它自己的定义。 C# 有两种直接执行此操作的方法:1. 最初将函数变量定义为 null 和 2. 声明一个普通的命名方法(迄今为止首选技术)。
关于c# - 我们需要 C# 中的定点组合器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758082/