2015-02-05 2 views
0

Я пытаюсь выполнить функцию, которая будет печатать Fizz, Buzz или Fizzbuzz в зависимости от числа, которое можно разделить на 3, 5 или оба. (это то, что я имею в виду: http://en.wikipedia.org/wiki/Fizz_buzz)Fizzbuzz игра для for loop

Вот как далеко до того, как я застрял.

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

Я получаю ответ «,», и я не знаю, почему.

Просто уточнить. Я хочу, чтобы мой ответ распечатывался »« 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 "" и т. Д. В зависимости от «остановки».

+2

Поскольку ваш цикл for не имеет скобок, что означает только var string = ','; выполняется внутри цикла –

+0

Являются ли скобки {} или []? Я также хотел бы добавить, что я все еще очень новичок в javascript! – micke

ответ

1

Комментарий Валентина правильная, вам нужно добавить скобки вокруг своей петли. Вы также переопределяете строку var на каждой итерации цикла.

Последнее если и делает вывод немного неправильно, как, например, 15 поразит все 3 заявления и печати FizzBuzzFizzBuzz

так что идти с чем-то вроде

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

Это не самый лучший способ сохранить отслеживать, где добавить запятую, но она выполняет эту работу.

0

Вам нужно исправить ваш цикл

Вы

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

не выполняется до тех пор, x <= stop.

Javascript позволяет избежать использования скобок, если вы хотите выполнить так называемые строки.

if (a===true) 
    alert(a); // This is executed when a === true 

alert(b); // This is always executed no matter what a is 

отступов здесь было сделать замечание, но если оператор не будет выполнять все до первой точки с запятой.

С другой стороны, если вы хотите, чтобы выполнить несколько строк кода, если a === true вы решили использовать фигурные скобки, как так

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

если заявление будет выполнять все, что в фигурных скобках.

Важно отметить, что return останавливает выполнение и выходит из функции. Как только вы достигнете оператора 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. 
}; 
+0

Эта реализация дает мне ответ: «Fizz buzz, Fizz buzz, Fizz, Fizz buzz, Buzz, Fizz, Fizz buzz, Fizz buzz, Fizz, Buzz, Fizz buzz, Fizz, Fizz buzz, Fizz buzz, Buzz, Fizz buzz, Fizz buzz, Fizz, Fizz buzz, Buzz, Fizz, Fizz buzz, Fizz buzz, Fizz, Buzz, Fizz buzz, Fizz, « – micke

+0

Служит мне правильно, чтобы на самом деле не проверять его. Взгляните на него еще раз. Каждое значение было fizz buzz, потому что я проверял, является ли '(x% 3 && x% 5)', что истинно для каждого числа, а не '(x% 3 === 0 && x% 5 === 0)'. Fiddle здесь http://jsfiddle.net/Lm44axy7/ – Deepak

+0

Это работает отлично! Знаете ли вы способ, которым я могу удалить «,» из ответа? Я получаю это после последнего значения. Он заканчивается так: «22,23, Fizz, Buzz, 26, Fizz», – micke

0

Есть несколько проблем с этим: (1) Конструкция

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

выполнит заявление 10 раз перед выполнением другого оператора.Без фигурных скобок Javascript предполагает, что следующий оператор является содержимым цикла for;

(2) Строковая переменная переопределяется в каждом цикле, который избавляется от предыдущей версии, поэтому оператор return выводит только последнее значение строки.

(3) Логика высказываний fizzBuzz 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; 
    }; 

Обратите внимание, что третий, если заявление на 15%, необходимо только, если эта версия требует, чтобы вы распечатываете FizzBuzz, а не FizzBuzz.

+0

Это решение дает мне: SyntaxError: отсутствует имя переменной \t функция Var (старт, стоп) { – micke

+0

К сожалению, я пропустил имя функции в объявлении, а также несколько других синтаксических ошибок. Я не достаточно уверен, чтобы надежно использовать js в текстовом редакторе с нулевыми синтаксическими ошибками. Должен попытаться скомпилировать его. –