← Назад к вопросам
FizzBuzz
1.2 Junior🔥 101 комментариев
#Алгоритмы и структуры данных
Условие
Напишите функцию fizzBuzz(n), которая выводит числа от 1 до n со следующими правилами:
- Для чисел, кратных 3, выводить "Fizz"
- Для чисел, кратных 5, выводить "Buzz"
- Для чисел, кратных и 3, и 5, выводить "FizzBuzz"
- Для остальных чисел выводить само число
function fizzBuzz(n) {
// Ваш код
}
fizzBuzz(15);
// 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz
Что проверяется
- Базовая логика программирования
- Работа с условиями
- Оператор деления по модулю
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
FizzBuzz — классическая задача для проверки базовой логики программирования. Разберу несколько подходов от простого к более элегантному.
Базовый подход с if-else
function fizzBuzz(n: number): void {
for (let i = 1; i <= n; 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. Порядок важен!
Более элегантный подход с конструированием строки
function fizzBuzz(n: number): void {
for (let i = 1; i <= n; i++) {
let output = "";
if (i % 3 === 0) output += "Fizz";
if (i % 5 === 0) output += "Buzz";
console.log(output || i);
}
}
Преимущества:
- Более гибкий код — легко добавить новые правила
- Избегаем многоуровневых условий
output || i— если строка пуста, выводим число
Возвращение массива вместо console.log
function fizzBuzz(n: number): (string | number)[] {
const result: (string | number)[] = [];
for (let i = 1; i <= n; i++) {
let output = "";
if (i % 3 === 0) output += "Fizz";
if (i % 5 === 0) output += "Buzz";
result.push(output || i);
}
return result;
}
// Использование
const result = fizzBuzz(15);
console.log(result.join(", "));
// 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz
Почему это лучше:
- Функция чистая (не имеет побочных эффектов)
- Легче тестировать
- Можно использовать результат в других операциях
Функциональный подход с map
function fizzBuzz(n: number): (string | number)[] {
return Array.from({ length: n }, (_, i) => {
const num = i + 1;
let output = "";
if (num % 3 === 0) output += "Fizz";
if (num % 5 === 0) output += "Buzz";
return output || num;
});
}
Этот вариант более декларативный и функциональный.
С использованием конфигурации (расширяемо)
interface Rule {
divisor: number;
word: string;
}
function fizzBuzz(n: number, rules: Rule[] = []): (string | number)[] {
// Правила по умолчанию
const defaultRules: Rule[] = [
{ divisor: 3, word: "Fizz" },
{ divisor: 5, word: "Buzz" },
];
const activeRules = rules.length > 0 ? rules : defaultRules;
return Array.from({ length: n }, (_, i) => {
const num = i + 1;
let output = "";
for (const rule of activeRules) {
if (num % rule.divisor === 0) {
output += rule.word;
}
}
return output || num;
});
}
// Использование
const result = fizzBuzz(15);
console.log(result); // [1, 2, "Fizz", 4, "Buzz", ...]
// Можем передать свои правила
const customResult = fizzBuzz(10, [
{ divisor: 2, word: "Even" },
{ divisor: 3, word: "Three" },
]);
Тестирование
const result = fizzBuzz(15);
const expected = [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"];
console.log(JSON.stringify(result) === JSON.stringify(expected)); // true
Выбор решения для интервью
Для интервью рекомендую второй подход (конструирование строки) — он показывает:
- Понимание логики программирования
- Аккуратный дизайн кода
- Избегание излишней сложности
Если просят "на продакшене», упомяните, что вернёте массив вместо console.log, чтобы функция была чистой и тестируемой.
Ключевые моменты:
- Оператор модуля
%проверяет делимость - Проверяем все условия независимо (оба if, не else if)
- Пустая строка в JavaScript falsy, поэтому
output || iработает - Читаемость важнее, чем микрооптимизация