JavaScript: Возврат из циклов
Работа с циклами обычно сводится к двум сценариям:
- Агрегация. Накопление результата во время итераций и работа с ним после цикла. Переворот строки как раз относится к такому варианту.
- Выполнение цикла до достижения необходимого результата и выход. Например, задача поиска простых чисел. Напомним, что простое число — это число, которое делится без остатка только на себя и на единицу.
Рассмотрим простой алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x - 1 и смотреть остаток от деления. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит перед нами простое число.
Проверка простоты числа 5: пошаговый разбор
- Берём число
x = 5. Возможные делители ищем в диапазоне от 2 доx - 1, то есть от 2 до 4. - Делим 5 на 2. Остаток равен 1 — делителя не нашли, продолжаем.
- Делим 5 на 3. Остаток равен 2 — делителя не нашли, продолжаем.
- Делим 5 на 4. Остаток равен 1 — делителя не нашли, завершаем перебор.
Итог: в диапазоне 2…4 не нашлось ни одного числа, на которое 5 делится без остатка. Следовательно, 5 — простое число.
Если задуматься, то можно заметить, что достаточно проверять числа не до x - 1, а до половины числа. Например, 11 не делится на 2, 3, 4, 5. Но и дальше гарантированно не будет делиться на числа больше своей половины. Значит, можно провести небольшую оптимизацию и проверять деление только до x / 2.
const isPrime = (number) => {
if (number < 2) {
return false;
}
let divider = 2;
while (divider <= number / 2) {
if (number % divider === 0) {
return false;
}
divider += 1;
}
return true;
}
isPrime(1); // false
isPrime(2); // true
isPrime(3); // true
isPrime(4); // falsewhile (...) {
if (условие) {
return значение; ← выход из функции (и из цикла)
}
...
}
─────────────────────────
Без return цикл продолжается до концаАлгоритм построен так: если во время последовательного деления на числа до x / 2 находится хоть одно, которое делит без остатка, то переданный аргумент — не простое число, и дальнейшие вычисления не имеют смысла. В этом месте стоит возврат false.
И только если цикл отработал целиком и не нашлось числа, которое делит без остатка, можно сделать вывод, что число простое.
Если быть до конца честными, для решения задачи хватит проверки чисел до квадратного корня из number. Но здесь нам важно сосредоточиться на понимании работы с условиями и возвратом внутри цикла.
Задание
Реализуйте функцию hasAtSymbol(), которая проверяет, есть ли в email символ @.
Функция должна вернуть true, как только найдёт @. Если цикл дошёл до конца строки и символ не найден — вернуть false.
hasAtSymbol('support@example.com'); // => true
hasAtSymbol('wrong-email'); // => false
hasAtSymbol('@admin'); // => trueИспользуйте цикл с ранним return.
Полезное
JavaScript: Возврат из циклов
Работа с циклами обычно сводится к двум сценариям:
- Агрегация. Накопление результата во время итераций и работа с ним после цикла. Переворот строки как раз относится к такому варианту.
- Выполнение цикла до достижения необходимого результата и выход. Например, задача поиска простых чисел. Напомним, что простое число — это число, которое делится без остатка только на себя и на единицу.
Рассмотрим простой алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x - 1 и смотреть остаток от деления. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит перед нами простое число.
Проверка простоты числа 5: пошаговый разбор
- Берём число
x = 5. Возможные делители ищем в диапазоне от 2 доx - 1, то есть от 2 до 4. - Делим 5 на 2. Остаток равен 1 — делителя не нашли, продолжаем.
- Делим 5 на 3. Остаток равен 2 — делителя не нашли, продолжаем.
- Делим 5 на 4. Остаток равен 1 — делителя не нашли, завершаем перебор.
Итог: в диапазоне 2…4 не нашлось ни одного числа, на которое 5 делится без остатка. Следовательно, 5 — простое число.
Если задуматься, то можно заметить, что достаточно проверять числа не до x - 1, а до половины числа. Например, 11 не делится на 2, 3, 4, 5. Но и дальше гарантированно не будет делиться на числа больше своей половины. Значит, можно провести небольшую оптимизацию и проверять деление только до x / 2.
const isPrime = (number) => {
if (number < 2) {
return false;
}
let divider = 2;
while (divider <= number / 2) {
if (number % divider === 0) {
return false;
}
divider += 1;
}
return true;
}
isPrime(1); // false
isPrime(2); // true
isPrime(3); // true
isPrime(4); // falsewhile (...) {
if (условие) {
return значение; ← выход из функции (и из цикла)
}
...
}
─────────────────────────
Без return цикл продолжается до концаАлгоритм построен так: если во время последовательного деления на числа до x / 2 находится хоть одно, которое делит без остатка, то переданный аргумент — не простое число, и дальнейшие вычисления не имеют смысла. В этом месте стоит возврат false.
И только если цикл отработал целиком и не нашлось числа, которое делит без остатка, можно сделать вывод, что число простое.
Если быть до конца честными, для решения задачи хватит проверки чисел до квадратного корня из number. Но здесь нам важно сосредоточиться на понимании работы с условиями и возвратом внутри цикла.
Задание
Реализуйте функцию hasAtSymbol(), которая проверяет, есть ли в email символ @.
Функция должна вернуть true, как только найдёт @. Если цикл дошёл до конца строки и символ не найден — вернуть false.
hasAtSymbol('support@example.com'); // => true
hasAtSymbol('wrong-email'); // => false
hasAtSymbol('@admin'); // => trueИспользуйте цикл с ранним return.
Полезное
Ваше упражнение проверяется по этим тестам
import { expect, test } from 'vitest';
import f from './index.js';
test('return from loops', () => {
expect(f('support@example.com')).toBe(true);
expect(f('wrong-email')).toBe(false);
expect(f('@admin')).toBe(true);
expect(f('a@b')).toBe(true);
});Решение учителя откроется через:
20:00
