在C#中使用YCombinator在C#中使用YCombinator我正在尝试弄清楚如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多)。为此,我想到了使用Lambda微积分的Y组合器。这是第一个定义:Y=λf.(λx.f(xx))(λx.f(xx))这是简化的定义:Yg=g(Yg)我尝试用C#编写它们://OriginalLambdaY=f=>(newLambda(x=>f(x(x)))(newLambda(x=>f(x(x)))));//减少的LambdaY=null;Y=g=>g(Y(g));(Lambda是一个Func。我首先尝试使用它,但是没有用,所以现在使用委托动态Lambda(dynamicarg);)我的阶乘lambda看起来像这样(从这里改编):Lambdafactorial=f=>新的Lambda(n=>n==1?1:n*f(n-1));我称之为:intresult=(int)(Y(factorial))(5);但是,在这两种情况下(Y组合器的原始形式和简化形式),我都以堆栈溢出异常结束。从我可以使用简化形式推测的情况来看,它似乎最终调用了Y(factorial(Y(factorial(Y(factorial(...并且永远不会以阶乘lambda结束。因为我没有太多经验调试C#lambda表达式,我当然不太了解lambda演算,我真的不知道发生了什么或如何解决它。如果重要的话,这个问题的灵感来自于试图在C#。我的解决方案如下:staticIEnumerableAllSubstrings(stringinput){return(fromiinEnumerable.Range(0,input.Length)fromjinEnumerable.Range(1,input.Length-i)selectinput.Substring(i,j)).SelectMany(substr=>getPermutations(substr,substr.Length));}staticIEnumerablegetPermutations(stringinput,intlength){returnlength==1?输入.Select(ch=>ch.ToString()):getPermutations(input,length-1).SelectMany(perm=>input.Where(elem=>!perm.Contains(elem)),(str1,str2)=>海峡1+海峡2);}//像这样调用:string[]result=AllSubstrings("abcd").ToArray();我的目标是将getPermutations编写为单行自递归lambda,以便我可以将其插入到AllSubstrings的SelectMany中,并从AllSubstrings创建AllSubstrings。我的问题如下:在C#中可以使用Y组合器吗?如果是这样,我在实施中做错了什么?如果Y组合子在C#中可用,我怎样才能使我的解决方案解决子字符串问题(AllSubstrings函数)?不管Y组合器在C#中不可用这一事实,是否有任何其他编程方式来实现AllSubstrings?下面是我在C#中使用的Y组合器的实现:publicdelegateTS(Ss);publicstaticTU(Ss){返回s(s);}publicstaticFuncY(Funcf){returnU(r=>a=>f(U(r))(a));我可以这样使用它:varfact=Y(_=>x=>x==0?1:x*_(x-1));varfibo=Y(_=>x=>x这真的让我害怕所以我会把你问题的下两部分作为起点留给你。学习。这是:varallsubstrings=Y>(_=>x=>x.Length==1?new[]{x}:Enumerable.Range(0,x.Length).SelectMany(i=>_(x.删除(i,1)).SelectMany(z=>new[]{x.Substring(i,1)+z,z})).Distinct());当然,你运行这个:allsubstrings("abcd");从中我得到了这个结果:abcdbcdacdcdabdbdaddabdcbdcadcdcabcbcaccacbdcbdacdbcdbadbdbacbcbabbadbcdbcadcbdcbbacdbadbadbacbcadcadbcdacdabdadabcacabaabdacdacbdcadcacabdcadbcabcbadcbdacbacdabdabcdbadbadabcdacbdbacdbcadcabdcba您问题中的非Y-Combinator代码似乎缺少一堆排列。以上就是《C#学习教程:在C#中使用YCombinator》的全部内容分享。如果对你有用,需要进一步了解《C#学习教程》,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
