#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. что-то не так с моим процессом удаления из очереди… Это не приведет к удалению последнего элемента;- (