当前位置: 首页 > 编程语言 > C#

“匿名递归”在.NET中有效吗?它是否在.NET中有效的Mono中共享

时间:2023-04-10 17:07:13 C#

“匿名递归”?它在Mono中我几天前在“C#AnonymousRecursion”中看到了这个站点。本文的要点是以下代码在C#中不起作用:Funcfib=n=>n>1?fib(n-1)+fib(n-2):n;然后,文章详细介绍了如何使用currying和Y-combinator回到C#中的“匿名递归”。这很有趣,但恐怕对我的日常编码来说有点复杂。至少在这一点上……我喜欢看自己的东西,所以我打开了MonoCSharpREPL并输入了那一行。没有错误。所以,我输入了fib(8);.令我惊讶的是,它奏效了!REPL回复21!我想也许这可能是REPL的魔法,所以我启动了“vi”,输入了以下程序,然后它编译了。使用系统;公共类程序{publicstaticvoidMain(string[]args){intx=int.解析(参数[0]);函数fib=n=>n>1?fib(n-1)+fib(n-2):n;控制台.WriteLine(fib(x));它也可以完美地构建和运行!我在Mac上运行Mono2.10。我现在无法访问Windows机器,因此无法在Windows上的.NET上进行测试。这在.NET上是固定的还是Mono的静音功能?这篇文章已有好几年了。如果它只是单声道,我等不及下一次面试,他们要求我用我选择的语言(MonoC#)编写Fibinocci函数,我必须提供.NET无法工作的警告。好吧,实际上我可以等待,因为我热爱我的工作。仍然很有趣......更新:Mono并没有真正进行“匿名”递归,因为它使用fib作为命名委托。我的错。事实上,MonoC#编译器在分配fib之前假定它为空值是错误的,如下所述。我说“编译器”是因为即使.NETC#编译器无法编译代码,.NETCLR也能很好地运行生成的程序集。对于那里的所有采访纳粹分子:Funcfib=n=>n>1?fib(n-1)+fib(n-2):n;可以替换为迭代版本:Funcfib=n=>{intold=1;国际电流=1;下一个;for(inti=2;in>1?fib(n-1)+fib(n-2):n;...问题是当你尝试在上面的方法中使用它时fib没有定义,所以静态分析器报告编译错误。看来,在我的兴奋中,我根本就错了。.NET和Mono都不像原始帖子那样提供“匿名递归”。您不能将fib作为单独的实体传递。在MonoC#REPL中查看以下序列:csharp>Funcfib=n=>n>1?fib(n-1)+fib(n-2):n;csharp>fibCopy=fib;csharp>fib(6);8csharp>fibCopy(6);8csharp>fib=n=>n*2;csharp>fib(6);12csharp>fibCopy(6);18这是因为:fib=n=>n*2;fibCopy=n>1?fib(n-1)+fib(n-2):n;换句话说,fibCopy=n>1?(n-1)*2+(n-2)*2:n;//目前很明显fibCopy只是指向fib(委托)的当前定义,而不是它本身。所以Mono实际上只是在初始分配期间将fib预先分配给null,因此分配有效。我更喜欢不必声明null的便利性,所以我喜欢这种行为。但这不是原始文章所说的。在Microsoft的C#编译器中,将fib设置为null仅在第一次有效。否则,它会产生错误,因为fib在分配之前被使用。Mono的编译器“足够聪明”避免了这个错误(换句话说,它违反了官方规范)以上是C#学习教程:“匿名递归”在.NET中有效吗?它在Mono中分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: