Циклический алгоритм для увеличения числа до тех пор, пока оно не достигнет значения, а затем уменьшение

Я пытаюсь увеличивать число до тех пор, пока оно не достигнет значения (скажем, 100), затем уменьшаю его до тех пор, пока оно не достигнет 0, и все это выполняется в цикле while.

Код кажется правильным, но браузер зависает, поэтому я не могу проверить в консоли, есть ли ошибка в алгоритме.

var ceiling = 100;
var floor = 1;
var x = 1;
var step = 1; 

setInterval(function(){
    while(1) {
        while(x + step <= ceiling) {
            x += step;
            document.write(x + ' ');        
        }
        while(x - step >= floor) {
            x -= step;
            document.write(x + ' ');        
        }
    }
}, 1500);

Я использовал setInterval здесь, чтобы замедлить выполнение и избежать некоторых проблем с буферизацией в браузере. Это не должно быть проблемой, поскольку у меня 16 ГБ ОЗУ, но это может зависеть от того, как браузер может использовать/получать доступ к этому на одной вкладке.

Я также попытался обернуть функцию setInterval внутри другой функции и выполнить ее с тем же результатом.


person dolanator    schedule 24.10.2015    source источник
comment
Как вы ожидаете, что ваш код выйдет из бесконечного цикла while...   -  person Shashank    schedule 24.10.2015
comment
Это должен быть бесконечный цикл, хотя и бесконечный цикл с замедленным выполнением.   -  person dolanator    schedule 24.10.2015
comment
Почему бы вам не сделать простой тест, чтобы увидеть, действительно ли ваш бесконечный цикл замедляется, как вы думаете? Вы действительно думаете, что setInterval влияет на цикл внутри функции? Проверьте свои теории.   -  person Shashank    schedule 24.10.2015


Ответы (3)


Другие ответы уже указывали на проблемы с вашим бесконечным циклом и с использованием document.write.

Я думаю, что это делает то, что вы хотите:

var ceiling = 100;
var floor = 1;
var x = 1;
var step = 1;

setInterval(function() {
  console.log(x);
  x += step;
  if (x === ceiling || x === floor) {
    step = -step;
  }
}, 1500);

setInterval — это, по сути, ваш цикл while(1).

person Christian Pekeler    schedule 24.10.2015
comment
Я уже заставил это работать, добавив return в конце цикла, но я приму этот ответ, поскольку он работает с меньшим количеством кода. - person dolanator; 24.10.2015

У вас есть цикл while(1), который по сути является бесконечным циклом, даже если код не выполняется, он зависает в браузере.

person Olavi Sau    schedule 24.10.2015
comment
Если вы используете setInterval с правильной настройкой, он не должен зависать в браузере. Кто сказал, что бесконечные циклы неприменимы в алгоритмах? Этот код работает в консоли, если, кстати, заменить document.write на console.log. Таким образом, в запуске бесконечного цикла нет ничего нефункционального по своей сути, при условии, что вы замедлите его достаточно, чтобы буфер браузера догнал скорость выполнения. - person dolanator; 24.10.2015
comment
Вам, ребята, нужно остановиться с бесконечным циклом. эта крошечная функция почти не займет памяти. Таким образом, будет наблюдаться устойчивый рост параллельных функций. Может быть, он хочет построить график того, сколько заданных интервальных функций он может запускать одновременно. возможно, он пытается понять поведение нескольких функций setinterval, работающих одновременно. - person AwokeKnowing; 24.10.2015
comment
На самом деле я пытаюсь смоделировать поведение частицы, которая продолжает расти до точки, а затем начинает уменьшаться (на холсте), и все это в непрерывном цикле. Я уверен, что это возможно. Всем спасибо за помощь. - person dolanator; 24.10.2015
comment
@AwokeKnowing Никогда не будет работать более одной функции одновременно. Цикл событий не может запустить новую функцию, если она все еще выполняется. Все синхронно. - person Shashank; 24.10.2015
comment
@Шашанк хм, верно. в любом случае нет причин для внешнего пока. - person AwokeKnowing; 24.10.2015
comment
Вы можете попробовать это в своей консоли @Olavi Sau. Работает: var x = 1; setInterval(function(){ while(true){ document.body.innerHTML += ((x++)+'<br>'); return; } }, 1000); - person dolanator; 24.10.2015
comment
Именно так, но увеличенное значение x сохраняется, поэтому при следующем выполнении цикл снова увеличит его, а затем вернется. - person dolanator; 24.10.2015
comment
@kuantik Да, но в исходном коде вы никогда не возвращаетесь из какой-либо функции. Помните, что JavaScript является синхронным, поэтому ваш setInterval будет ждать, пока функция завершится или что-то вернет. Поскольку вы никогда не выходите из цикла while, программа блокируется навсегда. - person Matias Cicero; 24.10.2015

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

person AwokeKnowing    schedule 24.10.2015
comment
Вы, вероятно, правы, так как это работает в консоли, если я вывожу число (x) с помощью console.log. Я попытаюсь добавить его как текстовый узел или что-то подобное. - person dolanator; 24.10.2015
comment
@kuantik, вы можете попробовать document.body.innerHTML+=(x+‹br›) - person AwokeKnowing; 24.10.2015