2

谁能告诉我在哪里可以阅读最佳实践来编写严重依赖数学计算的应用程序?例如,假设我被要求编写一个生成 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);
        }
    }
}
4

4 回答 4

3

如果您追求表现力,请从函数式编程中获取一页:

public static IEnumerable<int> EvenNumbers(int start = 0)
{
    while (true)
    {
        yield return start;
        start += 2;
    }
}

然后得到你的序列:

var firstHundredEvenNumbers = EvenNumers().Take(100);

这真的取决于你的目标。如果您正在寻找构图,则上述内容很棒。如果您正在寻找原始速度,那么您应该将所有逻辑混搭成一个球并对其进行调整 - 但它会更难使用。

于 2012-12-25T15:08:34.863 回答
2

是什么让您认为第二种方法是最好的方法?如果我被要求做那个问题,那么我会这样做,所以我只循环 100 次。

for (int i = 0; i < 200; i += 2)
    Console.WriteLine(i);

至于您的更一般的问题,没有任何文档或书籍可以为您提供有关如何形成循环或处理数学问题的最佳实践。这是计算机科学教育派上用场的地方,可以分析您的问题并尝试找到最佳解决方案。

在您的示例问题中,提出的每个解决方案(包括我提出的解决方案)都归结为 N 的大 O,因此这些解决方案之间的计算差异可以忽略不计。增长相对于 N 是线性的。我的解决方案提供的唯一优势是它只循环生成输出所需的项目,而不是跳过不符合标准的项目。

于 2012-12-25T14:39:14.177 回答
0

实际上,您可能正在寻找Donald Knuth的The Art of Computer Programming

它被称为the bible of all fundamental algorithms并包含多种编程算法及其分析。但它不涵盖任何特定于语言的时刻。

于 2012-12-25T15:03:10.547 回答
-1

如果要生成数字,可以使用 Enumerable.Range :

编辑:(rotem)

var a = Enumerable.Range(1,100/ 2+ 1).Select((X) => X * 2).ToList();
于 2012-12-25T14:38:07.067 回答