任何人都可以让我知道在哪里可以阅读编写严重依赖于数学计算的应用程序的最佳实践?例如,假设我被要求编写一个生成100个偶数的C#应用程序。我会写以下内容:
public void GenerateEven() {
for (int i=0;i<100;i++) {
Console.WriteLine(i * 2);
}
}
然而,这不是最好的做法。生成偶数的最佳方法是,例如:
public void GenerateEven() {
int i=0;
while (i <200) {
if (i % 2 == 0) {
Console.Writeline(i);
}
}
}
答案 0 :(得分:3)
如果您追求表现力,请从功能编程中获取一页:
public static IEnumerable<int> EvenNumbers(int start = 0)
{
while (true)
{
yield return start;
start += 2;
}
}
然后得到你的序列:
var firstHundredEvenNumbers = EvenNumers().Take(100);
这实际上取决于你的目标。如果你正在寻找作曲,上面的内容很棒。如果你正在寻找原始速度,那么你应该将所有逻辑混合成一个球并调整它 - 但它将更难以使用。
答案 1 :(得分:2)
是什么让你认为第二种方法是最好的方法?如果我被要求做那个问题,那么我会这样做,所以我只循环了100次。
for (int i = 0; i < 200; i += 2)
Console.WriteLine(i);
至于更一般的问题,没有一本文件或书籍可以为您提供有关如何形成循环或处理数学问题的最佳实践。这就是computer science教育可以用来分析您的问题并尝试找到最佳解决方案的地方。
在您的示例问题中,所提出的每个解决方案(包括我提出的解决方案)都降至N big O,因此这些解决方案之间的计算差异可以忽略不计。增长与N呈线性关系。我的解决方案提供的唯一优势是它只会循环生成输出所需的项目,而不是跳过不符合标准的项目。
答案 2 :(得分:0)
实际上你可能正在寻找Donald Knuth的The Art of Computer Programming
它被称为the bible of all fundamental algorithms
,包含多种编程算法及其分析。但它并没有涵盖任何语言特定的时刻。
答案 3 :(得分:-1)
如果要生成数字,可以使用Enumerable.Range:
编辑:(图腾)
var a = Enumerable.Range(1,100/ 2+ 1).Select((X) => X * 2).ToList();