Codecademy FizzBu​​zz应用程序,坚持第1步

时间:2012-01-10 02:25:28

标签: javascript fizzbuzz

这是我Codecamedy's FizzBuzz lesson

的代码
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"。然后,在确定我不能被3整除之后,它应检查我是否可以被5整除并显示" Buzz"如果是这样的话。如果没有完全可分,那就应该显示数字。

正如我所料......它没有按预期工作。我做了多么令人尴尬的错误?

10 个答案:

答案 0 :(得分:8)

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

for ( i = 1; i > 20; i++ )
由于中间条件最初为假,因此

不会迭代一次。我想你的意思是:

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

"FizzBuzz";

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

console.log("FizzBuzz");

此外,这个块

else {
    i;
  }

也没有做任何事情。你想显示那些既不被3也不能整除的数字吗?

else {
    console.log(i);
  }

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


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

if ( i % 5 === 0 )

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

答案 1 :(得分:3)

您的具体问题是您对for循环有错误的认识,而"somestring"i这样的陈述实际上 。你要做的是输出它做控制台(或某种其他输出流) - 如何做到这一点取决于你的Javascript运行环境,以及你想要的信息去哪里。

您还可以记住,任何可被3个五个整除的数字都是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

答案 2 :(得分: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);
    };
} 

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

for ( i = 1; i > 20; i++ )表示该程序将不执行任何操作。如果您希望变量i以1开头并以20结尾,那么您应该像for( i = 1; i <= 20; i++)那样执行此操作。如果你想测试一些你想要的数字,你应该使用如下函数:

function TestFizzBuzz(num){
    ...
    ...
}
TestFizzBuzz(1);
TestFizzBuzz(990);
...

答案 5 :(得分: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;
}

答案 6 :(得分: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]);
    }
}

答案 7 :(得分:0)

为了简洁起见,让我们一行:

for (i=1;i<21;i++){console.log(i+": "+(i%3?(i%5?i:'Buzz'):(i%5?'Fizz':'FizzBuzz')));};

答案 8 :(得分: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);
      }

    };

答案 9 :(得分:0)

目标是印刷&#34; Fizz&#34;对于可被3整除的数字(没有休息),&#34; Buzz&#34;由5和&#34; FizzBu​​zz&#34;按3和5,否则它应该打印数字。

  • modulo(%)返回除法的其余部分,因此如果(x%y)返回0,则检查的除法是积分的
  • 因为modulo可以返回0,我们需要记住真值和假值 - 0是一个假值,因此我们需要否定测试,如果我们想检查一个数字是否真的&#34;真的&#34 ; 0

    例如:!(3%3)=&gt; !(0)=&gt; !false =&gt;真

&#13;
&#13;
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
  }
}
&#13;
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
&#13;
&#13;
&#13;