【问题标题】:Fizzbuzz game with for loop带有 for 循环的 Fizzbuzz 游戏
【发布时间】:2015-02-05 12:29:09
【问题描述】:

我正在尝试执行一项功能,该功能将在我的 console.log 中打印 1-27 之间的数字。

当一个数字可以被3整除时,它应该用“Fizz”代替这个数字
当一个数字可以被 5 整除时,将其替换为“Buzz”。
如果数字可以同时被 3 和 5 整除,则将其替换为“Fizzbuzz”

参考:http://en.wikipedia.org/wiki/Fizz_buzz)

这是我的代码:

 var fizzbuzz = function(start,stop) {
    for (var x=1;x <= stop; x++)
        var string =',';
    if (x%3 == 0) {
            string += 'Fizz';
    }
    if (x%5 ==  0){
        string += 'Buzz';
    }
    if (x%5 && x%3){
        string += 'Fizzbuzz';
    }
    return string;
};

Console.log 给了我“,”,我不确定我做错了什么。

只是为了澄清。 我希望我的答案打印出 1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,Fizz Buzz,16,17,Fizz,19,Buzz,Fizz,22,23,Fizz,Buzz,26,Fizz 等等,具体取决于 If 语句中的“停止”。

【问题讨论】:

  • 因为你的 for 循环没有括号,也就是说只有 var string = ',';在循环内执行
  • 括号是{}还是[]?我还要补充一点,我对 javascript 还是很陌生!

标签: javascript if-statement for-loop fizzbuzz


【解决方案1】:

Valentins 的评论是正确的,您确实需要在循环周围添加括号。 但是,您也在循环的每次迭代中重新定义字符串 var。

最后一个 if 也会使输出有点错误,例如 15 会命中所有 3 个语句并打印 FizzBu​​zzFizzBu​​zz

所以选择类似的东西

var fizzbuzz = function(start,stop) {
  var string = '';
  var addComma = false;
  for (var x=1;x <= stop; x++){
    addComma = false;
    if (x%3 == 0) {
        string += 'Fizz';
        addComma = true;
    }
    if (x%5 ==  0){
        string += 'Buzz';
        addComma = true;
    }
    if(addComma && x!== stop){
        string+=','
    }
  }
  return string;
};

这不是跟踪在何处添加逗号的最佳方式,但它确实有效。

【讨论】:

    【解决方案2】:
    for(let x = 0; x <=30; x++) {
    if (x % 15 === 0) {
        console.log('Fizzbuzz')
    } else if (x % 5 === 0) {
        console.log('Buzz')
    } else if (x % 3 === 0) {
        console.log('Fizz')
    } else {
        console.log(x)
    }
    

    }

    我就是这样处理的

    【讨论】:

    • 除以 15 应该返回 ''Fizzbuzz'',而不是 ''Fizz Buzz''
    【解决方案3】:

    你需要更正你的 for 循环

    你有

    for (var x=1;x <= stop; x++)
        var string =',';
    

    执行到x &lt;= stop

    如果你想像这样执行一行语句,Javascript 允许你避免使用括号。

    if (a===true)
        alert(a); // This is executed when a === true
    
    alert(b); // This is always executed no matter what a is
    

    这里的缩进是为了说明一点,但 if 语句会执行所有操作,直到第一个分号为止。

    另一方面,如果你想执行多行代码 if a === true 你会选择像这样使用花括号

    // Alert a and alert b are only executed if a is true
    if (a===true) {
        alert(a);
        alert(b);
    } 
    

    if 语句将执行花括号中的所有内容。

    需要注意的是return 会停止执行并退出函数。一旦你到达一个返回语句,循环将被退出。这就是为什么你应该在 for 循环之后返回整个字符串。

    这是一个更好的实现但您绝对应该尝试自己实现它

    var fizzbuzz = function(start,stop) {
        var string = '';
    
        for (var x=1;x <= stop; x++) {
            var status = x.toString(); //Each time the loop executes a new variable `status`is created and set to the value `x` for that loop.
    
            // x is checked as to whether it is divisible by 3 or 5 or both, if it is divisible its status is set to a that value
            if (x%3 === 0) {
                status = 'Fizz';
            }
            if (x%5 ===  0){
                status = 'Buzz';
            }
            if (x%5 === 0 && x%3 === 0){
                status = 'Fizzbuzz';
            }
    
            string += status; // Append status to the end
    
            if (x !== stop){ // If x is not equal to the value of stop add a comma
                string += ',';
            }
        }
    
        return string; //This returns the string value which has had statuses and commas appended to it.
    };
    

    【讨论】:

    • 这个实现给了我答案:“嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声、嘶嘶声,Buzz,Fizz 嗡嗡声,Fizz 嗡嗡声,Fizz,Fizz 嗡嗡声,Buzz,Fizz,Fizz 嗡嗡声,Fizz 嗡嗡声,Fizz,Buzz,Fizz 嗡嗡声,Fizz,"
    • 为我服务,因为我没有实际检查它。再看一遍。每个值都是嘶嘶声,因为我正在检查 (x % 3 &amp;&amp; x % 5) 是否对每个数字都正确,而不是 (x % 3 === 0 &amp;&amp; x % 5 === 0) 是否正确。小提琴在这里jsfiddle.net/Lm44axy7
    • 效果很好!你知道我可以从答案中删除“,”的方法吗?我在最后一个值之后得到这个。它的结尾是这样的:“22,23,Fizz,Buzz,26,Fizz,"
    • 有很多好方法可以做到这一点。问题出在 for 循环的最后一行,无论如何都会附加状态和逗号。我将使用的方式(避免更改结构)将修复最后一行string += status + ',';。相反,您可以说“如果 x === stop(这是传递给函数的值 stop),则仅将状态附加到字符串,否则附加状态和逗号”。这是一个很好的做法,使用我在上一条评论中发布的小提琴并修改它来说明这一点。如果您在 JSFiddle 顶部按保存并在此处发布链接,我会看看它。
    • 我试着按照你说的做,改变最后一行。我可能已经把它弄坏了!如果你想帮我看看我做错了什么,这里是链接。 jsfiddle.net/Lm44axy7/5
    【解决方案4】:

    这有多个问题: (1) 构造

    for (var x=1;x <= 10; x++)
        statement;
    otherstatement;
    

    在执行其他语句之前将执行语句 10 次。没有大括号,Javascript 假定下一条语句是 for 循环的内容;

    (2) 字符串变量在每一个循环中都被重新定义,摆脱了之前的版本,所以return语句只打印出字符串的最后一个值。

    (3) fizzBu​​zz if 语句的逻辑错误。如果您对除以 15 的语句执行此操作,它将执行所有三个语句。因此,第三个 iff 语句是完全多余的。

    解决方案如下所示:

    var fizzBuzz = function(x){
        if(x%15==0){
             return "Fizzbuzz";
        }
        if(x%3==0){
              return "Fizz";
        }
        if(x%5==0){
              return "Buzz";
        }
        return x;
        };
    
    var mainFunction = function(start,stop){
        var str="";
        for(var i=start; i < stop; i++){
              str += fizzBuzz(i) + ", ";
        }
           return str;
        };
    

    请注意,仅当此版本要求您打印 Fizzbuzz 而不是 FizzBu​​zz 时,才需要 %15 的第三个 if 语句。

    【讨论】:

    • 这个解决方案给了我:SyntaxError: missing variable name var function(start,stop){
    • 抱歉,我在声明中遗漏了函数的名称,并且还有其他一些语法错误。我不是很流利,无法在语法错误为零的文本编辑器中可靠地纠正 js。应该尝试编译它。