以下是相关代码:
var L1 = [];
var Q1 = [];
function populateListOne() {
var limit = prompt("please enter a number you would like to fill L1 to.");
for (i = 2; i <= limit; i++) {
L1[i] = i;
}
for (n = 2; n <= L1.length; n++) {
var count = 2;
if (n == count) {
var index = L1.indexOf(n);
L1.splice(index, 1);
Q1[n] = n;
count = count + 1;
}
for (j = 0; j <= L1.length; j++) {
if (L1[j] % 2 == 0) {
var secondIndex = L1.indexOf(j);
L1.splice(secondIndex, 1);
}
}
}
document.getElementById("demo").innerHTML = "iteration " + "1" + ": " + L1 + " Q1 = " + Q1;
}
我正在做家庭作业,我必须设置一个队列。所有内容都在我的JSFiddle中解释。
基本上,我坚持的部分是遍历数组的每个实例,然后在模数等于0时取出值。但是,正如您在运行程序时所看到的那样,它不会以这种方式解决。我知道问题出现在第二个for循环中我只是看不出我做错了什么。
我读它的方式是,如果j
小于数组的长度,则递增。然后,如果L1[j]
模数2的索引的值与0相同,则将secondIndex
的值设置为j
的索引。然后splice
出来了。因此,从理论上讲,只能删除可被2整除的数字。
单个数字limit
,用于填充数组L1
。
L1
将使用值2,3,... limit
初始化。
获取数组L1
的起始元素并将其放在数组Q1
中。
使用该元素,删除数组L1
中可被该数字整除的所有值。
重复直到数组L1
为空。
答案 0 :(得分:0)
如果要在循环中更改数组,则会遇到循环数组的问题。为了解决这个问题,我倾向于从后到前迭代(另请注意:从array.length - 1
迭代,因为length
元素不存在,数组从0开始键入:)
for(j = L1.length - 1; j >=0 ; j--)
对于第一个循环,您会错过元素L1[0]
和L1[1]
,因此我会将第一个循环更改为:
L1 = [];
for(i = 2; i <= limit; i++)
{
L1.push(i);
}
答案 1 :(得分:0)
您的初始代码使用了一个初始化为从索引2开始的数组。为了避免混淆,从哪个索引开始,从索引0开始并迭代到array.length
而不是预定义的值limit
,以确保您浏览每个元素。
以下情况仍有效,但更令您头疼,因为您需要记住从哪里开始以及何时结束。
for (i = 2; i <= limit; i++) {
L1[i] = i; // 'i' will begin at two!
}
这是一个更好的方法:
for (i = 2; i <= limit; i++) {
// 'i' starts at 2 and since L1 is an empty array,
// pushing elements into it will start index at 0!
L1.push(i);
}
当您需要查看数组开头的值时,如果您按照我上面有关数组键的建议,可以使用L1[0]
来完成此操作。
但是,当您确定需要删除数组的起始元素时,请使用Array.slice(idx, amt)
。 idx
指定从哪个索引开始,amt
指定从该索引(包括)开始删除的元素数。
// Go to 1st element in L1. Remove (1 element at index 0) from L1.
var current = L1.splice(0, 1);
为了让您的生活更轻松,请在必要时使用合适的循环。当您确切知道要迭代的次数时,将使用For循环。在您期待活动时使用while循环。
在您的情况下,&#39;重复直到L1为空&#39;直接翻译为:
do {
// divisibility checking
} while (L1.length > 0);
这里有一个完整的JS fiddle内嵌评论,完全按照您的说法完成。
答案 2 :(得分:0)
在本节中:
for(j = 0; j <= L1.length; j++){
if(L1[j] % 2 == 0)
{
var secondIndex = L1.indexOf(j);
L1.splice(secondIndex, 1);
}
}
你应该用j而不是secondIndex拼接。
更改L1.splice(secondIndex,1);到L1.splice(j,1);