我在采访中被问到这个问题。以下算法的输出非常好,但对于较大的输入参数来说它非常慢。如何在不改变计算逻辑的情况下提高性能?
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();
}
答案 0 :(得分:-1)
由于递归函数对大多数输入值执行多次,因此我能想到的最佳解决方案是存储输出值以避免重复计算:
String
它在性能方面产生了巨大的变化。 编辑:感谢LasseVågsætherKarlsen的评论,发现这种技术被称为Memoization。