2

这是我的Codecamedy 的 FizzBu​​zz 课程的代码

var i;
for ( i = 1; i > 20; i++ ) {
  "hello"
  if ( i % 3 === 0 ) {
    if ( i % 5 === 0 ) {
      "FizzBuzz";
    }
    else {
      "Fizz";
    }
  }
  else if ( i % 5 === 0 ) {
    "Buzz";
  }
 else {
    i;
  }
}

我试图首先测试数字(i)是否可以被 3 整除。如果是,我想检查它是否也能被 5 整除。如果两个条件都为真,我想让它说“FizzBu​​zz ”。如果只有第一个条件为真,它应该说“Fizz”。然后,在确定 i 不能被 3 整除后,它应该检查 i 是否能被 5 整除,如果是则显示“Buzz”。没有所有可分性,它应该只显示数字。

正如我所料......它没有按预期工作。我犯了什么可怕的错误?

4

10 回答 10

8

首先,您的循环甚至还没有开始:

for ( i = 1; i > 20; i++ )

由于中间条件最初为假,因此不会迭代一次。我想你的意思是:

for ( i = 1; i <= 20; i++ )

"FizzBuzz";

只是 JavaScript 忽略的字符串文字。您需要以某种方式输出此字符串:

console.log("FizzBuzz");

还有这个块

else {
    i;
  }

也没有做任何事情。您是否要显示既不能被 3 也不能被 5 整除的数字?

else {
    console.log(i);
  }

而且,在类似的说明中,"hello"顶部循环应该做什么?


在更积极的方面,我看到你正在使用严格的平等:

if ( i % 5 === 0 )

这是一个非常非常好的习惯。如果您不小心,非严格的相等运算符 == 将执行各种隐式转换。 除非您有目的地希望这些隐式转换发生,否则请 始终使用严格相等。

于 2012-01-10T02:27:26.163 回答
3
for (var i = 1; i <= 20; i++) {
    if (i % 15 === 0) {
        console.log("FizzBuzz");
    }
    else if (i % 3 === 0) {
        console.log("Fizz");
    }
     else if (i % 5 === 0) {
        console.log("Buzz");
    }
    else{
    console.log(i);
    };
} 
于 2014-01-27T05:34:19.473 回答
3

您的具体问题是您对for循环有错误的认识,并且声明喜欢"somestring"i实际上没有任何事情。您想要做的是将它输出到控制台(或某种其他输出流) - 如何执行此操作取决于您的 Javascript 运行的环境以及您希望信息去哪里。

您还可以记住,任何能被 3和5整除的数字都是15 的倍数。

因此,您可以通过以下方式简化代码:

for all numbers in range:
    if num is a multiple of 15:
        print "FizzBuzz"
        continue for loop

    if num is a multiple of 3:
        print "Fizz"
        continue for loop

    if num is a multiple of 5:
        print "Buzz"
        continue for loop

    print i

有些人会抱怨循环中有多个退出或重启点,但您可以放心地忽略它们,因为他们不理解该准则背后的原因,以避免意大利面条式代码。

任何可以在单个页面上看到所有控制流的代码(例如上面的 11 行)都不能成为意大利面条代码,尤其是在处理一致的情况下。


这是等效的 Javascript 代码,打包到网页中进行测试:

<html><head></head><body><script type="text/javascript">
    var i;
    for (i = 1; i <= 20; i++) {
        if (i % 15 === 0) {
            document.write ("FizzBuzz<br>");
            continue;
        };  

        if (i % 3 === 0) {
            document.write ("Fizz<br>");
            continue;
        };  

        if (i % 5 === 0) {
            document.write ("Buzz<br>");
            continue;
        };  

        document.write (i + "<br>");
    }   
</script></body></html>

根据需要输出:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
于 2012-01-10T02:37:56.417 回答
2

在考虑了所有其他非常好的答案之后:

由于您提供的代码“停留在第 1 步”,我假设您在单击链接并阅读说明后犯了同样的错误。第 1 步实际上并不要求您解决 Fizzbuzz 问题。要通过这一步,你只需要做一些更简单的事情。再次阅读(不是很好)说明;)

于 2012-01-10T02:51:46.733 回答
1

for ( i = 1; i > 20; i++ )意味着程序什么也不做。如果您希望变量i以 1 开头并以 20 结尾,您应该像for( i = 1; i <= 20; i++). 如果你想测试一些你想要的数字,你应该使用如下函数:

function TestFizzBuzz(num){
    ...
    ...
}
TestFizzBuzz(1);
TestFizzBuzz(990);
...
于 2012-01-10T02:43:42.663 回答
1

如果我们让事情变得更困难怎么办?1) 不允许除法或模运算;2) 循环必须跳过所有不必要的迭代。这是答案:

int n3 = 3;
int n5 = 5;
int i = 3;
while (i <= 100)
{
    Console.Write(i.ToString() + " - ");

    if (i == n3)
    {
        Console.Write("fizz");

        n3 = n3 + 3;
    }

    if (i == n5)
    {
        Console.Write("buzz");

        n5 = n5 + 5;
    }

    Console.WriteLine();

    i = n3 < n5 ? n3 : n5;
}
于 2014-12-22T11:19:35.603 回答
0

我的解决方案:

var nums = new Array();

for (var i = 0; i < 20; i++){
    nums[i] = i + 1;
}

for (var i = 0; i < 20; i++){
    if((nums[i] % 5 == 0) && (nums[i] % 3 == 0)){
        console.log("FizzBuzz");
    }else if(nums[i] % 5 == 0){
        console.log("Buzz");
    }else if (nums[i] % 3 == 0){
        console.log("Fizz");
    }else{
        console.log(nums[i]);
    }
}
于 2015-03-16T16:03:50.703 回答
0

只是为了简短起见,让我们在一行中完成:

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));};
于 2015-05-20T08:41:11.597 回答
0
  for(var i =1; i<=20; i++){
  if(i % 15 === 0){
      console.log("FizzBuzz");
  }
  else  if(i % 5 === 0){
      console.log("Buzz");
  }

    else  if(i % 3 === 0){
      console.log("Fizz");
  }
  else{
       console.log(i);
      }

    };
于 2015-07-21T09:50:51.033 回答
0

目标是打印可被 3 整除的数字“Fizz”(无休止符)、“Buzz”被 5 和“FizzBu​​zz”被 3 和 5 整除,否则它应该打印数字。

  • 模 (%) 返回除法的其余部分,因此如果 (x % y) 返回 0,则检查的除法是整数
  • 由于模可以返回 0,我们需要记住真值和假值 - 0 是假值,因此如果我们想检查一个数字是否“真”0,我们需要否定测试

    例如:!(3 % 3) => !(0) => !false => true

for (var i = 1; i <= 20; ++i) {
  if (!(i % 3) && !(i % 5)) { // check if "i" is integral divisible by 3 & 5
    console.log("FizzBuzz");
  } else if (!(i % 3)) {      // else check if "i" is only integral divisible by 3
    console.log("Fizz");
  } else if (!(i % 5)) {      // else check if "i" is only integral divisible by 5
    console.log("Buzz");
  } else {
    console.log(i);           // else print the number
  }
}
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

于 2015-10-01T19:29:44.730 回答