迭代中的努力-FizzBuzz
编辑对于它的价值,哪个承认可能不那么多。我已经做了一些测试以扩展这个问题。
我编写了两个函数来枚举FizzBuzz“系列”。
private static IEnumerable<string> SimpleFizzBuzz(
int start = 0,
int end = int.MaxValue)
{
return Enumerable.Range(start, end).Select(i =>
i % 15 == 0 ? \"fizzbuzz\" :
i % 3 == 0 ? \"fizz\" :
i % 5 == 0 ? \"buzz\" :
i.ToString(CultureInfo.InvariantCulture));
}
和,
private static IEnumerable<string> OptimizedFizzBuzz(
int start = 0,
int end = int.MaxValue)
{
const int fizz = 3;
const int buzz = 5;
const string fizzString = \"fizz\";
const string buzzString = \"buzz\";
const string fizzBuzzString = fizzString + buzzString;
var fizzer = start % fizz;
var buzzer = start % buzz;
if (fizzer == 0)
{
fizzer = fizz;
}
if (buzzer == 0)
{
buzzer = buzz;
}
for (var i = start; i <= end; i++)
{
if (buzzer == buzz)
{
if (fizzer == fizz)
{
yield return fizzBuzzString;
buzzer = 1;
fizzer = 1;
continue;
}
yield return buzzString;
buzzer = 1;
fizzer++;
continue;
}
if (fizzer == fizz)
{
yield return fizzString;
buzzer++;
fizzer = 1;
continue;
}
yield return i.ToString(CultureInfo.InvariantCulture);
fizzer++;
buzzer++;
}
}
我做了一些时间安排,在Release配置中进行了编译,并进行了优化并从命令行运行。经过ѭ2次迭代,没有实际报告每个项目的开销,我得到的结果近似于:
简单:14.5秒
优化:10秒
您会注意到,“优化”功能更快但更详细。只需更改其头部的常量即可更改其行为。
抱歉,这似乎有点琐碎。
考虑此功能。
using System.Text;
public string FizzBanger(int bound)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i < bound; i++)
{
String line = String.Empty;
if (i % 3 == 0) line += \"fizz\";
if (i % 5 == 0) line += \"buzz\";
if (String.IsNullOrEmpty(line)) line = i.ToString();
result.AppendLine(line.ToString());
}
return result.ToString();
}
输出看起来像
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
...
有人能想到一种更好的方法吗?请同时考虑性能和可维护性。
没有找到相关结果
已邀请:
3 个回复
膛嵌墒缅欠
对于固定的上限(100),我不会为此而烦恼,但是…
但这7英镑不仅多余,而且效率很低。而且我甚至不需要进行基准测试就可以知道这一点。
这只会掩盖逻辑(应该实现“ fizzbuzz”问题,对吗?)。明确逻辑。 请同时考虑性能和可维护性。 那是错误的方法。可维护性第一,性能第二(如果有的话)。您的代码实际上效率很低,但这无关紧要:有100次迭代-性能根本不重要。 此外,此代码有哪些可维护性开销?这是具有固定规格的玩具样品。没有可维护性问题。我什至不会在这里花任何心思,Linq巧妙地解决了这个问题:
但是我同意,如果不习惯
功能,这可能会影响可读性。因此,使其更加明确:
其他一切都过度设计。
蹦吃舷弦
完趣镐