数学计算的c#编程最佳实践

本文关键字:最佳 编程 计算 | 更新日期: 2023-09-27 17:49:25

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

数学计算的c#编程最佳实践

如果您追求表达性,请参考函数式编程:

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

然后得到你的序列:

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

这真的取决于你的目标。如果你正在寻找构图,上面的是伟大的。如果你在寻找原始的速度,那么你应该把所有的逻辑揉成一个球,然后把它调出来——但这将更难工作。

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

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

至于你的更一般的问题,没有一个文档或书籍告诉你应该如何形成循环或处理数学问题的最佳实践。这就是计算机科学教育在分析你的问题并试图找到最佳解决方案时派上用场的地方。

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

实际上你可能正在寻找Donald Knuth的《The Art of Computer Programming》

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

如果要生成数字,可以使用Enumerable。范围:

编辑:(rotem)

var a = Enumerable.Range(1,100/ 2+ 1).Select((X) => X * 2).ToList();