n > 1 ? fib(n - 1) + fib(n - 2)-6ren">
gpt4 book ai didi

c# - "Anonymous Recursion"在 .NET 中有效吗?它在单声道

转载 作者:太空狗 更新时间:2023-10-29 22:08:35 25 4
gpt4 key购买 nike

我浏览了 this几天前在“C# 中的匿名递归”上的站点。这篇文章的主旨是以下代码在 C# 中不起作用:

Func<int, int> fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

文章然后详细介绍了如何使用 curryingY-combinator回到 C# 中的“匿名递归”。这很有趣,但恐怕对我的日常编码来说有点复杂。至少在这一点上……

我喜欢自己看东西,所以我打开了 Mono CSharp REPL并进入该行。没有错误。所以,我输入了 fib(8);。令我非常惊讶的是,它奏效了! REPL 回复 21!

我想这可能是 REPL 的神奇之处,所以我启动了“vi”,输入了以下程序并进行了编译。

using System;

public class Program
{
public static void Main(string[] args)
{
int x = int.Parse(args[0]);
Func<int, int> fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Console.WriteLine(fib(x));
}
}

它的构建和运行也非常完美!

我在 Mac 上运行 Mono 2.10。我现在无法访问 Windows 机器,因此我无法在 Windows 上的 .NET 上测试它。

这是否也已在 .NET 上修复,或者这是 Mono 的静默功能?这篇文章已有几年历史了。

如果它只是 Mono,我等不及下一次工作面试,他们要求我用我选择的语言 (Mono C#) 编写一个 Fibinocci 函数,我必须提供一个警告,即 .NET 将无法工作。嗯,其实我可以等,因为我热爱我的工作。仍然,有趣...

更新:

Mono 并没有真正进行“匿名”递归,因为它使用 fib 作为命名委托(delegate)。我的错。事实上,Mono C# 编译器在赋值之前假定 fibnull 值是一个错误,如下所述。我说“编译器”是因为 .NET CLR 可以很好地运行生成的程序集,即使 .NET C# 编译器不会编译代码。

对于那里所有的纳粹采访:

Func<int, int> fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;

可以替换为迭代版本:

Func<int, int> fib = n => 
{
int old = 1;
int current = 1;
int next;

for (int i = 2; i < n; i++)
{
next = current + old;
old = current;
current = next;
}
return current;
};

您可能想要这样做,因为递归版本在 C# 等语言中效率低下。有些人可能会建议使用 memoization但是,由于这仍然比迭代方法慢,他们可能只是在胡闹。 :-)

虽然在这一点上,这更像是函数式编程的广告而不是其他任何东西(因为递归版本要好得多)。它确实与我最初的问题没有任何关系,但一些答案认为它很重要。

最佳答案

这是一个 bug在 Mono 编译器中。它违反了 specification 的第 12.3.3 节.变量 fib 不能在变量初始值设定项中使用,因为它不是明确分配的。

关于c# - "Anonymous Recursion"在 .NET 中有效吗?它在单声道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5488015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com