2013-05-18 29 views
2

有人可以纠正我的代码FizzBu​​zz?似乎有一个小错误。下面这个代码打印所有的号码,而不是仅打印不属于被3整除或5使用Javascript的FizzBu​​zz程序(详细内容)

号编写将输出数字从1100的程序。但是,对于三的倍数,打印"Fizz"而不是数字,并为五的倍数,打印"Buzz"。对于数字是三和五的倍数,请打印"FizzBuzz"

function isDivisible(numa, num) { 
    if (numa % num == 0) { 
    return true; 
    } else { 
    return false; 
    } 
}; 

function by3(num) { 
    if (isDivisible(num, 3)) { 
    console.log("Fizz"); 
    } else { 
    return false; 
    } 
}; 

function by5(num) { 
    if (isDivisible(num, 5)) { 
    console.log("Buzz"); 
    } else { 
    return false; 
    } 
}; 

for (var a=1; a<=100; a++) { 
    if (by3(a)) { 
    by3(a); 
    if (by5(a)) { 
     by5(a); 
     console.log("\n"); 
    } else { 
     console.log("\n"); 
    } 
    } else if (by5(a)) { 
    by5(a); 
    console.log("\n"); 
    } else { 
    console.log(a+"\n") 
    } 
} 
+2

'i%5 == 0'不需要变成函数。退后一秒,问自己,“我该怎么办?” – Blender

+0

这是一个常见的问题..见http://c2.com/cgi/wiki?FizzBu​​zzTest – sachleen

+1

是的,该功能是不需要的@blender – pacmanfordinner

回答

5
/*Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”*/ 

var str="",x,y,a; 
for (a=1;a<=100;a++) 
{ 
    x = a%3 ==0; 
    y = a%5 ==0; 
    if(x) 
    { 
     str+="fizz" 
    } 
    if (y) 
    { 
     str+="buzz" 
    } 
    if (!(x||y)) 
    { 
     str+=a; 
    } 
    str+="\n" 
} 
console.log(str); 

无论如何,您的函数都会返回falsy值,但无论如何都会打印。没有必要使这个过于复杂。

小提琴:http://jsfiddle.net/ben336/7c9KN/

0

在你by3by5功能,您隐返回undefined如果是适用的,false如果它是不适用的,但你的if语句测试,如果它返回truefalse。如果适用,请返回true,以便您的if声明可以收到它。

+0

好吧!,明白了。更正通过添加返回true ;. – pacmanfordinner

40
for (var i = 1; i <= 100; i++) { 
    var expletive = ''; 
    if (i % 3 === 0) expletive += 'Fizz'; 
    if (i % 5 === 0) expletive += 'Buzz'; 
    console.log(expletive || i); 
} 
+3

我喜欢console.log上的逻辑运算符用法。 –

+0

这是最好的解决方案。 – DanielaB67

5

与FizzBu​​zz和JavaScript鬼混作为比较,以C#。

这里是我的版本,通过更rigid语言严重影响:

function FizzBuzz(aTarget) { 
    for (var i = 1; i <= aTarget; i++) { 
     var result = ""; 
     if (i%3 === 0) result += "Fizz";   
     if (i%5 === 0) result += "Buzz"; 
     if (result.length ===0) result = i; 

     console.log(result); 
    } 
} 

我喜欢读的结构和易用性。

现在,特雷弗·狄克逊巧妙所做的是继电器的语言(falsenullundefined''(空字符串),0NaN(非数字))的假y值缩短码。现在
,该if (result.length ===0) result = i;线是多余的,在代码如下:

function FizzBuzz(aTarget) { 
    for (var i = 1; i <= aTarget; i++) { 
     var result = ""; 
     if (i%3 === 0) result += "Fizz";   
     if (i%5 === 0) result += "Buzz"; 

     console.log(result || i); 
    } 
} 

在这里,我们转播的||经营者说:“如果result是假的,打印的迭代值(i)”。很酷的技巧,我想我需要更多地使用JavaScript来吸收这种逻辑。

你可以看到其他的例子(从GitHub),将范围从之类的东西:

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

没有在这里变量,只是15,3 & 5(我上面的一个只有3分检查师& 5,但有一个额外的变量,所以我想这是关心,或风格偏好的微基准。

要:

for(i=0;i<100;)console.log((++i%3?'':'Fizz')+(i%5?'':'Buzz')||i) 

其中,所有这一切在上线,中继的事实,0是一个虚假的值,这样你就可以使用,对于if-else缺兵少将的版本(? :),除||我们以前见过的诡计。

这里是上面的一个更可读的版本,有一些变量:

for (var i = 1; i <= 100; i++) { 
    var f = i % 3 == 0, b = i % 5 == 0; 
    console.log(f ? b ? "FizzBuzz" : "Fizz" : b ? "Buzz" : i); 
} 

一切的一切,你可以以不同的方式,我希望你拿起使用一些漂亮的提示在JavaScript: )

2
for(i = 1; i < 101; i++) { 
    if(i % 3 === 0) { 
     if(i % 5 === 0) { 
      console.log("FizzBuzz"); 
     } 
     else { 
      console.log("Fizz"); 
     } 
    } 
    else if(i % 5 === 0) { 
     console.log("Buzz"); 
    } 
    else { 
     console.log(i) 
    } 
} 
0
for (i=1; i<=100; i++) { 
    output = ""; 
    if (i%5==0) output = "buzz"; 
    if (i%3==0) output = "fizz" + output; 
    if (output=="") output = i; 
    console.log(output); 
} 
0

实用的风格! JSBin Demo

// create a iterable array with a length of 100 
// and map every value to a random number from 1 to a 100 
var series = Array.apply(null, Array(100)).map(function() { 
    return Math.round(Math.random() * 100) + 1; 
}); 

// define the fizzbuzz function which takes an interger as input 
// it evaluates the case expressions similar to Haskell's guards 
var fizzbuzz = function (item) { 
    switch (true) { 
    case item % 15 === 0: 
     console.log('fizzbuzz'); 
     break; 
    case item % 3 === 0: 
     console.log('fizz'); 
     break; 
    case item % 5 === 0: 
     console.log('buzz'); 
     break; 
    default: 
     console.log(item); 
     break; 
    } 
}; 

// map the series values to the fizzbuzz function 
series.map(fizzbuzz); 
1

Codeacademy今晚在我身上发射了一个FizzBu​​zz。我有一个模糊的记忆,它是“一件事”,所以我这样做。不是最好的方式,也许,但不同于上面:

var data = { 
    Fizz:3, 
    Buzz:5 
}; 

for (var i=1;i<=100;i++) { 
    var value = ''; 
    for (var k in data) { 
     value += i%data[k]?'':k; 
    } 
    console.log(value?value:i); 
} 

它依赖于数据,而不是代码。我认为如果这种方法有一个优点,那就是你可以去FizzBu​​zzBing 3 5 7或者进一步添加额外的逻辑,只要你按规则指定的顺序分配对象元素即可。例如:

var data = { 
    Fizz:3, 
    Buzz:5, 
    Bing:7, 
    Boom:11, 
    Zing:13 
}; 

for (var i=1;i<=1000;i++) { 
    var value = ''; 
    for (var k in data) { 
     value += i%data[k]?'':k; 
    } 
    console.log(value?value:i); 
} 
-1

不同功能的风格 - 幼稚

fbRule = function(x,y,f,b,z){return function(z){return (z % (x*y) == 0 ? f+b: (z % x == 0 ? f : (z % y == 0 ? b: z))) }} 

range = function(n){return Array.apply(null, Array(n)).map(function (_, i) {return i+1;});} 

range(100).map(fbRule(3,5, "fizz", "buzz")) 

,或者掺入结构如在上面的例子:即[[3, “嘶嘶声”],[5, “嗡嗡”] ,...]

fbRule = function(fbArr,z){ 
    return function(z){ 
    var ed = fbArr.reduce(function(sum, unit){return z%unit[0] === 0 ? sum.concat(unit[1]) : sum }, []) 
    return ed.length>0 ? ed.join("") : z 
    } 
} 

range = function(n){return Array.apply(null, Array(n)).map(function (_, i) {return i+1;});} 

range(100).map(fbRule([[3, "fizz"],[5, "buzz"]])) 

或者,使用ramda [从https://codereview.stackexchange.com/questions/108449/fizzbuzz-in-javascript-using-ramda]

var divisibleBy = R.curry(R.compose(R.equals(0), R.flip(R.modulo))) 
var fizzbuzz = R.map(R.cond([ 
    [R.both(divisibleBy(3), divisibleBy(5)), R.always('FizzBuzz')], 
    [divisibleBy(3), R.aklways('Fizz')], 
    [divisibleBy(5), R.always('Buzz')], 
    [R.T, R.identity] 
])); 

console.log(fizzbuzz(R.range(1,101))) 
0

作为ES6发生器:http://www.es6fiddle.net/i9lhnt2v/

function* FizzBuzz() { 

    let index = 0; 

    while (true) { 

     let value = ''; index++; 

     if (index % 3 === 0) value += 'Fizz'; 
     if (index % 5 === 0) value += 'Buzz'; 

     yield value || index; 

    } 

} 

let fb = FizzBuzz(); 
for (let index = 0; index < 100; index++) { 
    console.log(fb.next().value); 
} 
0

另一种解决方案,避免了多余的部门和消除 “嘶嘶声” 与 “嗡嗡” 之间多余的空格:

var num = 1; 
    var FIZZ = 3; // why not make this easily modded? 
    var BUZZ = 5; // ditto 
    var UPTO = 100; // ditto 
        // and easily extended to other effervescent sounds 

    while (num < UPTO) 
    { 
     var flag = false; 
     if (num % FIZZ == 0) { document.write ("Fizz"); flag = true; } 
     if (num % BUZZ == 0) { document.write ("Buzz"); flag = true; } 
     if (flag == false) { document.write (num); } 
     document.write ("<br>"); 
     num += 1; 
    } 

如果你使用JScript中使用/ JSC /.net,使用Console.Write()。如果您使用的是Node.js,请使用process.stdout.write()。不幸的是,console.log()追加了换行符,并且忽略了后退空间,所以它无法用于此目的。你也可以追加到一个字符串并打印出来。 (我是一个完整的n00b,但我认为(好吧,希望)我已经相当彻底。)

“Whaddya认为,先生?“

0

那我怎么没它:

不是最好的代码,但该诀窍

var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 

for(var i = 0 ; i <= 19 ; i++){ 

var fizz = numbers[i] % 3 === 0; 
var buzz = numbers[i] % 5 === 0; 
var fizzBuzz = numbers[i] % 5 === 0 && numbers[i] % 3 === 0; 

if(fizzBuzz){ 
    console.log("FizzBuzz"); 
    } 
else if(fizz){ 
    console.log("Fizz"); 
    } 
else if(buzz){ 
    console.log("Buzz"); 
    }  
else{ 
    console.log(numbers[i]); 
    } 

} 
0

检查了这一点

function fizzBuzz(){ 
    for(var i=1; i<=100; i++){ 
     if(i % 3 ===0 && i % 5===0){ 
      console.log(i+' fizzBuzz'); 
     } else if(i % 3 ===0){ 
      console.log(i+' fizz'); 
     } else if(i % 5 ===0){ 
      console.log(i+' buzz'); 
     } else { 
      console.log(i); 
     } 
    } 
}fizzBuzz(); 
1

这是我写的!

for (var num = 1; num<101; num = num + 1) { 
    if (num % 5 == 0 && num % 3 == 0) { 
     console.log("FizzBuzz"); 
    } 
    else if (num % 5 == 0) { 
     console.log("Buzz"); 
    } 
    else if (num % 3 == 0) { 
     console.log("Fizz"); 
    } 
    else { 
     console.log(num); 
    } 
} 
0

稍有不同的实现。

你可以把你自己的论据到函数。可以是非连续的数字,如[0,3,10,1,4]。默认设置仅为1-15。

function fizzbuzz (set) { 
 
    
 
    var set = set ? set : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
 
    var isValidSet = set.map((element) => {if (typeof element !== 'number') {return false} else return true}).indexOf(false) === -1 ? true : false 
 
    var gotFizz = (n) => {if (n % 3 === 0) {return true} else return false} 
 
    var gotBuzz = (n) => {if (n % 5 === 0) {return true} else return false} 
 
    
 
    if (!Array.isArray(set)) return new Error('First argument must an array with "Number" elements') 
 
    if (!isValidSet) return new Error('The elements of the first argument must all be "Numbers"') 
 

 
    set.forEach((n) => { 
 

 
    if (gotFizz(n) && gotBuzz(n)) return console.log('fizzbuzz') 
 
    if (gotFizz(n)) return console.log('fizz') 
 
    if (gotBuzz(n)) return console.log('buzz') 
 
    else return console.log(n) 
 
    }) 
 
}

0

var num = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
 

 
var runLoop = function() { 
 
for (var i = 1; i<=num.length; i++) { 
 
    if (i % 5 === 0 && i % 3 === 0) { 
 
     console.log("FizzBuzz"); 
 
    } 
 
    else if (i % 5 === 0) { 
 
     console.log("Buzz"); 
 
    } 
 
    else if (i % 3 === 0) { 
 
     console.log("Fizz"); 
 
    } 
 
    else { 
 
     console.log(i); 
 
    } 
 
} 
 
}; 
 
runLoop();

0

想和大家分享我的方式来解决这个

for (i = 1; i <= 100; i++){ 
    if (i % 3 === 0 && i % 5 === 0) { 
    console.log('fizzBuzz'); 
    } else if (i % 3 === 0) { 
    console.log('fizz'); 
    } else if (i % 5 === 0){ 
    console.log('buzz'); 
    } else { 
    console.log(i); 
    } 
} 
0

var limit = prompt("Enter the number limit"); 
 
var n = parseInt(limit); 
 
var series = 0; 
 
for(i=1;i<n;i++){  
 
    series = series+" " +check(); 
 
} 
 

 
function check() { 
 
    var result; 
 
    if (i%3==0 && i%5==0) { // check whether the number is divisible by both 3 and 5 
 
    result = "fizzbuzz "; // if so, return fizzbuzz 
 
    return result; 
 
    } 
 
    else if (i%3==0) { // check whether the number is divisible by 3 
 
    result = "fizz "; // if so, return fizz 
 
    return result; 
 
    } 
 
    else if (i%5==0) { // check whether the number is divisible by 5 
 
    result = "buzz "; // if so, return buzz 
 
    return result; 
 
    } 
 
    else return i; // if all the above conditions fail, then return the number as it is 
 
} 
 

 
alert(series);

0
for (var i = 1; i <= 100; i++) { 
    if (i % 3 === 0 && i % 5 === 0) console.log("FizzBuzz"); 
    else if (i%3 === 0) console.log("Fizz");  
    else if (i%5 === 0) console.log("Buzz");  
    else console.log(i);  
} 

一到FizzBu​​zz最简单的方法。 多的3和5,在同一时间,指的多个15.

第二个版本:

for (var i = 1; i <= 100; 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);  
} 
0

如果有人正在寻找其他解决方案:这一个是递归,和可重复使用的功能任选定制参数值:

const fizzBuzz = (from = 1, till = 100, ruleMap = { 
 
    3: "Fizz", 
 
    5: "Buzz", 
 
}) => from > till || console.log(
 
    Object.keys(ruleMap) 
 
    .filter(number => from % number === 0) 
 
    .map(number => ruleMap[number]).join("") || from 
 
) || fizzBuzz(from + 1, till, ruleMap); 
 

 
// Usage: 
 
fizzBuzz(/*Default values*/);

  • from > till是打破递归的锚。由于它返回直到fromtill较高,它转到下一条语句(console.log):
  • Object.keys返回对象属性的给定ruleMap在默认情况下我们的情况是35的数组。
    • 然后,它遍历数字并只返回可被from(0作为休息)整除的数字。
    • 然后,它遍历过滤后的数字并根据规则输出该说法。
    • 然而,如果该filter方法返回一个空数组([],没有找到结果),则因为在端部的join方法最终返回只是一个空串(""),其是falsy value输出只是当前from值。
  • 由于console.log总是返回undefined,它进入下一条语句,并调用自身再次1递增from值。
相关问题