【问题标题】:Codecademy FizzBuzz app, stuck on step 1Codecademy FizzBu​​zz 应用程序,停留在第 1 步
【发布时间】:2012-02-06 13:02:41
【问题描述】:

这是我的 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”。然后,在确定 i 不能被 3 整除后,它应该检查 i 是否能被 5 整除,如果是则显示“Buzz”。不能全部除法,它应该只显示数字。

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

【问题讨论】:

    标签: javascript fizzbuzz


    【解决方案1】:

    首先,您的循环甚至还没有启动:

    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 )
    

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

    【讨论】:

    • 还要确保不要在顶部记录“hello”字符串
    • @fivedigit - 确实如此。我对此添加了注释。也许这应该是一个调试语句,只是确保程序还活着?
    • 谢谢亚当。这里很棒的建议。事实证明,我在课程的第一步做的太多了 - 请参阅下面 Andreas 的评论。
    • @mrdavidjcole - 当然可以。好吧,当您进入接下来的几个步骤时,希望以上内容会很有用:)
    • 我刚刚完成了剩下的课程,你们的 cmets 确实很有帮助。谢谢老先生。
    【解决方案2】:

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

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

    【讨论】:

    • 能否请教一下 === 0 在循环中的含义,例如 if (i % 15 === 0) {..}?
    【解决方案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);
        };
    } 
    

    【讨论】:

      【解决方案4】:

      在这里考虑所有其他非常好的答案后:

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

      【讨论】:

      • 啊哈!其他答案确实很好,并且非常有帮助。但你是对的。我在这里走得太远了。应重述这些指示。我去掉了所有 fizzbuzz 的东西,并以优异的成绩通过了这一步。谢谢。继续!
      【解决方案5】:

      for ( i = 1; i &gt; 20; i++ ) 表示程序什么也不做。如果您希望变量 i 以 1 开头并以 20 结尾,您应该像 for( i = 1; i &lt;= 20; i++) 那样做。如果你想测试一些你想要的数字,你应该使用如下函数:

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

      【讨论】:

        【解决方案6】:

        如果我们让事情变得更困难怎么办? 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;
        }
        

        【讨论】:

        • 除以 5 会更容易。只需检查它是否以 5 或 0 结尾。要检查可被 3 整除,您可以将每个单独的数字相加,直到最终为 0、3、6 或 9。aaamath.com/div66_x3.htm
        • 是的,你是对的,这些技巧肯定会加快代码速度。但我的解决方案是通用的,它适用于任何给定的数字对。
        【解决方案7】:

        我的解决方案:

        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]);
            }
        }
        

        【讨论】:

          【解决方案8】:

          为了简短起见,让我们一行完成:

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

          【讨论】:

            【解决方案9】:
              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);
                  }
            
                };
            

            【讨论】:

              【解决方案10】:

              目标是打印可被 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
                }
              }
              &lt;script src="https://getfirebug.com/firebug-lite-debug.js"&gt;&lt;/script&gt;

              【讨论】:

              • 请尝试为您的代码添加一些解释 - 这使其对 OP 和未来的读者更有用。尤其是在这种情况下,OP 不仅要求提供工作代码,而且实际上想知道原始代码哪里出错了。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-16
              • 1970-01-01
              • 2012-02-21
              • 2018-07-18
              • 2012-11-04
              • 2016-10-15
              相关资源
              最近更新 更多