C#慢递归方法

时间:2018-06-02 19:39:29

标签: c# performance recursion optimization

我在采访中被问到这个问题。以下算法的输出非常好,但对于较大的输入参数来说它非常慢。如何在不改变计算逻辑的情况下提高性能?

    public static int SomeAlgo(int n)
    {
        if ((n == 0) || (n == 1))
        {
            return n;
        }
        else
        {
            return SomeAlgo(n - 1) + SomeAlgo(n - 2);
        }
   }

从参数值40开始变得非常慢。 我使用下面的代码来检查执行时间:

static void Main(string[] args)
{
    var watch = System.Diagnostics.Stopwatch.StartNew();

    Console.WriteLine("Algo Output: " + SomeAlgo(40));

    watch.Stop();
    var elapsedMs = watch.ElapsedMilliseconds;
    Console.WriteLine("Time taken in ms: " + elapsedMs);
    Console.ReadLine();
}

1 个答案:

答案 0 :(得分:-1)

由于递归函数对大多数输入值执行多次,因此我能想到的最佳解决方案是存储输出值以避免重复计算:

String

它在性能方面产生了巨大的变化。 编辑:感谢LasseVågsætherKarlsen的评论,发现这种技术被称为Memoization