首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么.NET/C#没有针对尾部调用递归进行优化?

为什么.NET/C#没有针对尾部调用递归进行优化?
EN

Stack Overflow用户
提问于 2009-01-29 12:20:21
回答 4查看 34.6K关注 0票数 120

我找到了关于哪种语言优化尾递归的this question。为什么C#不尽可能地优化尾递归?

对于一个具体的例子,为什么不将这个方法优化到一个循环中(Visual Studio 2008 32位,如果有关系的话):

private static void Foo(int i)
{
    if (i == 1000000)
        return;

    if (i % 100 == 0)
        Console.WriteLine(i);

    Foo(i+1);
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-29 12:42:16

JIT编译是一种微妙的平衡行为,既不花费太多时间进行编译阶段(因此大大减慢了短暂的应用程序),又没有进行足够的分析来保持应用程序在标准的提前编译中的长期竞争力。

有趣的是,NGen编译步骤的目标并不是更积极地进行优化。我怀疑这是因为他们只是不想有bug,因为行为依赖于机器代码是由JIT还是NGen负责的。

CLR本身确实支持尾部调用优化,但是特定于语言的编译器必须知道如何生成相关的opcode,并且必须愿意遵守它。F#'s fsc将生成相关的操作码(尽管对于简单的递归,它可能只是将整个事情直接转换为一个while循环)。C#的csc没有。

有关一些细节,请参阅this blog post (考虑到最近的JIT更改,现在很可能已过时)。请注意,对于4.0 the x86, x64 and ia64 will respect it,CLR会发生变化。

票数 89
EN

Stack Overflow用户

发布于 2009-01-29 12:34:47

我最近被告知,64位的C#编译器确实优化了尾递归。

C#也实现了这一点。之所以不总是应用尾递归,是因为用于应用尾递归的规则非常严格。

票数 9
EN

Stack Overflow用户

发布于 2012-05-23 19:52:12

您可以在C# (或Java)中将trampoline technique用于尾递归函数。然而,更好的解决方案(如果您只关心堆栈利用率)是使用this small helper方法包装相同递归函数的某些部分,并使其迭代,同时保持函数的可读性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/491376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档