没有支票怎么办?
string[] output = { "fizzbuzz", "", "", "fizz", "", "buzz", "fizz", "", "", "fizz", "buzz", "", "fizz", "", "" };
print("%s", output[x % 15]);
请注意,这当然只会从此代码中删除if
语句。底层代码很可能包含一两条跳转指令。
如果你想让它更清楚发生了什么,你可以创建两个数组:
string[] fizz = { "fizz", "", "" };
string[] buzz = { "buzz", "", "", "", "" };
print("%s%s", fizz[x % 3], buzz[x % 5]);
请注意,这两种实现都不会处理负数,这里有一个版本:
string[] fizz = { "fizz", "", "" };
string[] buzz = { "buzz", "", "", "", "" };
print("%s%s", fizz[((x % 3) + 3) % 3], buzz[((x % 5) + 5) % 5]);
请注意,我巧妙地跳过了您在代码中添加的换行符。如果您愿意,我相信您可以弄清楚如何以相同的方式修改上述代码以添加它:)
更重要的是:请注意,这实际上并没有通过“官方” fizzbuzz 测试,它只回答了您的问题。
fizzbuzz 测试是这样的:
- 写出从 1 到 100 的所有数字,除了数字是 3 的倍数,你应该写出“fizz”,而对于 5 的倍数,你应该写出“嗡嗡声”而不是数字。如果一个数字同时是3 和 5 的倍数,请写出“fizzbuzz”而不是数字。
由于您的问题没有以任何方式处理“而不是数字”部分,因此我的回答也没有。
因此,如果我们跳过循环通常需要“检查”这一事实,我们是否可以编写整个 fizzbuzz 测试而不使用 if 语句?
有点神奇,是的,我们可以,这是 C# 代码中的循环,您可以使用LINQPad或Ideone验证这一点:
void Main()
{
string[] fizzbuzz = new[]
{
"fizzbuzz", "{0}", "{0}", "fizz", "{0}", "buzz", "fizz",
"{0}", "{0}", "fizz", "buzz", "{0}", "fizz", "{0}", "{0}"
};
for (int index = 1; index <= 100; index++)
{
Debug.WriteLine(string.Format(fizzbuzz[index % 15], index));
}
}
在这里,我依赖于这样一个事实,即发送到的格式字符串string.Format
实际上不必包含对参数的任何引用。
编辑:如评论中所述,我曾经在参数??
中获取并将数组中的条目保留在,但确实是变相的 if 语句,因此将其编辑掉。"{0}"
string.Format
null
??