Перебор очереди с помощью циклов for и If / Else

#javascript #loops #queue

#javascript #циклы #очередь

Вопрос:

Привет и спасибо, что нашли время взглянуть на это.

Я пытаюсь добиться следующего результата:

 Iteration 0:
Queue 1 = 2345678910 | Queue 2 =
Iteration 1:
Queue 1 = 3579       | Queue 2 = 2
Iteration 2:
Queue 1 = 57         | Queue 2 = 23
Iteration 3:
Queue 1 = 7          | Queue 2 = 235
Iteration 4:
Queue 1 =            | Queue 2 = 2357
  

Предполагается, что это реализация «Сита Эратосфена«
Я не буду лгать, это, очевидно, школьная работа! (Хотя крайний срок прошел, и я не пытаюсь получить легкую оценку. Я действительно хочу знать, почему я не смог заставить это работать)
Я интенсивно искал, но все подобные вещи, которые я нашел, реализованы с использованием массивов.(чего профессор не разрешает)

вот скрипка, которая показывает, где я нахожусь:

Похоже, это моя проблема, она не удалит последний элемент.

 if (this.first == this.last) {
  this.first = null;
  return this.first.content;
  this.length--;
}    
  

Я загромоздил его всевозможными управляющими операторами, чтобы найти логическую проблему …

когда я начинал, я был уверен, что смогу сделать это следующим образом:

Перебираем очередь 1 и сохраняем текущее значение в (x) — Перебираем очередь 1, перемещаем первый элемент в очередь 2 —- IF/Else текущий элемент делится на x переместить в другую очередь

Я переключил его на циклы while, но он застрял с удалением последнего элемента

 // find the primes function
function fp() {
  fillQueue(); // call the fillQueue function below

  document.getElementById("output").innerHTML  = "Ctrl "   "|it. "   it   " |queue length "   q1.length   " |x "   x   " |current x"   cx   " |Q1: = "   q1.toString()   " | Q2: = "   q2.toString()   " | Q3: = "   q3.toString()   "<br />";

  while (q1.length >= 0) {
    dq1();
    cx = x;
    q3.enqueue(cx);

    while (q1.length >= 0) {
      dq1();
      eval();
      it  ;
    }

    while (q2.length >= 0) {
      dq2();
      d1.enqueue(x);
    }
  }
  

Комментарии:

1. Помните: = присваивание == is (или лучше === ) предназначено для сравнения. Эта строка вызовет у вас некоторые проблемы it = n - 1 . Вероятно, это также должно быть < или <= вместо = .

2. спасибо за ответ … это устранило проблему итерации и приблизило меня … все еще есть некоторые проблемы, которые нужно решить, поскольку вывод по-прежнему неправильный

Ответ №1:

Я предлагаю использовать другой подход и выполнять цикл, пока первый элемент numbers меньше числа, пока не произойдет проверка. Сделайте вывод протокола, введите первый элемент numbers в multiples , затем отфильтруйте numbers с проверкой на кратность числа с нулевым индексом.

В конце создайте другой вывод протокола.

 function calculate() {
    var number = document.getElementById('number').value,
        numbers = Array.apply(null, { length: number - 1 }).map(function (_, i) { return i   2; }),
        multiples = [];

    while (numbers[0] < number) {
        document.getElementById('out').innerHTML  = numbers.join(' ')   ' ||| '   multiples.join(' ')   'n';
        multiples.push(numbers[0]);				
        numbers = numbers.filter(function (a) {
            return a % numbers[0];
        });				
    }
    document.getElementById('out').innerHTML  = numbers.join(' ')   ' ||| '   multiples.join(' ')   'n';
}  
 <input id="number" /><button onclick="calculate()">calculate</button>
<pre id="out"></pre>  

Комментарии:

1. Большое вам спасибо … Мне это нравится … профессор не разрешает использовать массивы. Я собираюсь попытаться реализовать это с помощью очередей.

2. что-то не так с моим процессом удаления из очереди… Это не приведет к удалению последнего элемента;- (