C#递归方法可以内联吗?

时间:2017-12-10 08:51:17

标签: c# recursion inline tail-recursion

假设我有一个递归方法或静态方法。性能可以内联吗?它可能包含一个单行条件运算符。

3 个答案:

答案 0 :(得分:0)

这取决于功能的作用..

如果它是因子:(5!)== 5 * 4 * 3 * 2 * 1你可以用以下方式书写:

@Insert(onConflict = OnConflictStrategy.REPLACE) 

OR:

private static int Factorial(int v)
        {
            if (v == 1)
                return v;
            return v * Factorial(v - 1);
        }

但是 - 我确定并非所有功能都可以转移。 至于表现,第一个需要3个mili,n = 80,第二个需要0 mili ...所以是的 - 正如你所假设的那样有一个优势。

编辑: 我看到你现在放了一个“Tail recressions”的标签,当它悬停在标签上时 - 告诉你答案。是的编译器知道如何将这些递归转换为“内联”。我的时间测试指的是“调试”模式..也应该在发布中进行测试..

答案 1 :(得分:0)

这个怎么样? https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.methodimplattributes?view=netframework-4.7.1

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int DoSomething()
{
    return 0;
}

答案 2 :(得分:0)

即使您希望编译器内联您的方法。并非所有方法都可以内联。在这种情况下,递归方法不能是内联方法,因为它需要调用自身。

  

<强> AggressiveInlining
  指定应尽可能内联方法。

内联是用方法内容替换方法调用,因此不能内联递归方法。