Перейти к содержимому

Как остановить бесконечный цикл js

  • автор:

Как остановить бесконечный цикл в for который запускается с некоторыми значениями?

enter image description here

Но если поставить значения, допустим [2, 1, 5, 2, 7, 4, 10, 10] или [15,9,6,10,11,2,5] то программа попадает в infinity loop, что делать? Я решаю задачу где каждый элемент массива равен одному блоку контейнера, нужно посчитать сколько зерна влезет между блоками, нужно что бы оно не высыпалось: Думал ставить break но не знаю как правильно или делать проверку: if (levels.length — 1 < levels.length - 2) Но она не работает для всех вариантов когда появляется infinity loop

Отслеживать

задан 9 сен 2022 в 8:29

1 2 2 бронзовых знака

значения, допустим [2, 1, 5, 2, 7, 4, 10, 10] — что это?

9 сен 2022 в 8:55

Аргументы для фн addWheat()

9 сен 2022 в 9:00

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

К сожалению, не разобрался в логике твоей программы, ничего не скажу по поводу бесконечного цикла. Но в таком виде все тесты проходит нормально:

function addWheat(blocks) < if (blocks.length < 3) return 0; let res = 0; let maxHight = blocks.reduce((max, b) =>Math.max(max, b), 0); function calcVolume(left, right) < let hight = Math.min(blocks[left], blocks[right]); return blocks.filter((b, i) =>i>left && i acc += hight - b, 0); > let left = 0; let rigth = 1; do < while (blocks[left] < blocks [left+1]) left++; let right = left+1; let maxRight = right; while (blocks[left] >blocks[right] && right < blocks.length - 1 && blocks[right] < maxHight)< right++; if (blocks[right] >blocks[maxRight]) maxRight = right; > if(right == blocks.length - 1) < if(maxRight >left + 1) right = maxRight; else return res; > res += calcVolume(left, right); left = right; >while (left < blocks.length - 2) return res; >console.log('2= ', addWheat([4, 1, 3])) // 2 console.log('7= ', addWheat([2, 1, 5, 2, 7, 4, 10])) // 7 console.log('6= ', addWheat([2, 0, 1, 5, 2, 7])) // 6 console.log('0= ', addWheat([2, 4, 2]))// 0 console.log('0= ', addWheat([7, 4])) // 0 console.log('0= ', addWheat([])) // 0 console.log('9= ', addWheat([4,0,3,5,0,4])) console.log('3= ', addWheat([4,0,3,2,1,0])) // 0 console.log('0= ', addWheat([3, 2, 1]))

Как остановить цикл js

Чтобы остановить выполнение цикла можно использовать оператор break . Вот пример:

 i = i + 1; > console.log(i); // => 3 

30 октября 2022

По общему правилу цикл завершает свою работу, когда его условие становится ложным ( false ).

При необходимости мы можем остановить выполнение цикла, используя операторы return или break .

  • Пример с return :

Рассмотри функцию, которая определяет, является ли переданное в неё число простым (простое число — такое, которое без остатка делится только на 1 и на само себя: 7, 19, 29, 37 и т.д.)

const isPrime = (num) =>  // перебираем в цикле все числа от 2 до num - 1 for (let divisor = 2; divisor  num - 1; divisor += 1)  // если нашли такое число, на которое num делится без остатка, значит num не является простым числом if (num % divisor === 0)  // дальнейшее выполнение цикла прерывается, функция возвращает false return false; > > // цикл завершился, функция возвращает true, так как делитель не был найден, следовательно, num является простым числом return true; >; 
  • пример с break :

Оператор break полностью прекращает выполнение цикла и передаёт управление на первую строку, следующую за телом цикла.

let sum = 0; // создаем бесконечный цикл while (true)  // когда сумма достигнет 100, бесконечный цикл будет прерван и сработает console.log(sum) if (sum >= 100)  break; > sum += 1; > console.log(sum); // => 100 

Курсы javascript

Как мне сделать так что б скажем по нажатию на Enter или Esc
run = false;
и цикл бы останавливался
Ctrl + C не подходит так как он полностью тушит программу, а мне бы хотелось только выйти из этого цикла

Последний раз редактировалось Telnet, 10.03.2020 в 20:53 .
10.03.2020, 23:42
Регистрация: 04.12.2012
Сообщений: 3,654
11.03.2020, 19:15
Регистрация: 21.02.2011
Сообщений: 160

Таймер работает и каждую секунду выводит сколько уже прошло.
Но после запуска вообще перестает реагировать на любые кнопки с клавиатуры, даже Ctrl + C не срабатывает, помогает только перезагрузка консоли.

let keypress = require(‘keypress’); let run = true; let timer = 0; // make `process.stdin` begin emitting «keypress» events keypress(process.stdin); // listen for the «keypress» event process.stdin.on(‘keypress’, function (ch, key) < console.log('got "keypress"', key); >); process.stdin.setRawMode(true); process.stdin.resume(); const msleep = (milliSeconds) => Atomics.wait( new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliSeconds ) ; while (run)
Последний раз редактировалось Telnet, 11.03.2020 в 19:20 .
14.03.2020, 20:29
Регистрация: 21.02.2011
Сообщений: 160

вот пример бесконечного цикла не блокирующего Event loop
Выход из цикла while по нажатию на кнопку Esc
Выход из программы по нажатию по Ctrl + c

const readline = require('readline'); const sleep = require('await-sleep'); let run = true; let timer = 0; readline.emitKeypressEvents(process.stdin); process.stdin.setRawMode(true); process.stdin.on('keypress', (str, key) => < console.log(str, key, run); // Conditions on key if(key.name == 'escape')< run = false; >if(key.name == 'c' && key.ctrl == true) < process.exit(1); >>) async function init() < while (run)< await sleep(1000); timer++; console.log('timer',timer); >> init()

break

Оператор break прерывает выполнение текущего цикла, оператора множественного выбора switch или блочного выражения с меткой. Выполнение кода продолжается с конструкции, следующей за прерванной.

Интерактивный пример

Синтаксис

break [label]; 

label Необязательный

Идентификатор связанной метки. Если прерываемое выражение не цикл или switch , указание метки обязательно.

Описание

С помощью оператора break можно прервать выполнение блочного выражения с меткой. В таком случае break должен находиться внутри блока кода с указанной меткой. Само блочное выражение может быть любым, а не только циклом.

Использование break , с меткой или без, невозможно внутри функции, которая вложена в прерываемые цикл, конструкцию switch или блочное выражение с меткой.

Примеры

break в цикле while

Следующая функция использует оператор break для выхода из цикла while , когда i станет равно 3, и возвращает значение 3 * x .

function testBreak(x)  var i = 0; while (i  6)  if (i == 3)  break; > i += 1; > return i * x; > 

break в конструкции switch

В примере оператор break прервёт выполнение switch сразу после выполнения кода в совпавшем case .

const food = "sushi"; switch (food)  case "sushi": console.log("Sushi is originally from Japan."); break; case "pizza": console.log("Pizza is originally from Italy."); break; default: console.log("I have never heard of that dish."); break; > 

break в блочном выражении с указанной меткой

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

outer_block:  inner_block:  console.log("1"); break outer_block; // break прервёт выполнение кода как в inner_block, так и в outer_block console.log(":-("); // не будет выполнено > console.log("2"); // не будет выполнено > 

break вне блочного выражения с указанной меткой

В примере также используется break с меткой, но код будет выполнен с ошибкой SyntaxError , потому что break находится в блоке с меткой block_1 , а прерывается выполнение блока кода с меткой block_2 . Ещё раз, в таком случае break обязательно должен быть вложен в блок кода с меткой, выполнение которого требуется прервать.

block_1:  console.log('1'); break block_2; // SyntaxError: label not found > block_2:  console.log('2'); > 

break внутри функций

Код в примерах также будет выполнен с ошибкой SyntaxError , потому что в обоих случаях break находится в теле функции, вложенной в прерываемый цикл или прерываемое блочное выражение с меткой.

function testBreak(x)  var i = 0; while (i  6)  if (i == 3)  (function()  break; >)(); > i += 1; > return i * x; > testBreak(1); // SyntaxError: Illegal break statement 
block_1:  console.log('1'); ( function()  break block_1; // SyntaxError: Undefined label 'block_1' >)(); > 

Спецификации

Specification
ECMAScript Language Specification
# sec-break-statement

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *