我正在尝试制作一个小程序,提示用户将商品添加到购物清单。
我读到了使用递归循环。我理解while循环可能更适合这个任务,但我遇到了与while循环相同的问题,我想尝试递归。这听起来像我知道我在做什么......“是的,我使用递归来枚举数组,同时提示用户验证......赶紧赶走”......但是,我离题了。
以下是代码:
function addToArray() {
var array = [];
array.push(prompt("Add items to array or 'q' to stop"));
if (array.pop() == 'q') {
document.write(array)
}
else {
addToArray();
}
}
addToArray();
如果您注意到,它会像它应该的那样循环,但它不会向数组添加项目。我也试过了array[i] = i
技术,但无济于事,阵列仍然是空的。另外,为什么通过使用没有args的函数我没有遇到过多的递归?是因为条件陈述吗?
如果你知道我做错了什么,试着找出正确的答案,而不是只是脱口而出。我想要那个“啊哈”的时刻。我认为这一切都有助于我们更好地学习。
谢谢你们。 (和女孩)
答案 0 :(得分:4)
您正在创建一个新数组,而不是将其传递给递归调用。
改为做。
DEMO: http://jsfiddle.net/kDtZn/
function addToArray(array) {
array.push(prompt("Add items to array or 'q' to stop"));
if (array[array.length-1] == 'q') {
array.pop();
document.write(array)
}
else {
addToArray(array);
}
}
addToArray([]);
现在你从一个空数组开始,对于每个递归调用,它都会向前传递相同的数组。
另外,我更改了它,以便在.pop()
条件下不使用if()
,否则在编写它时总会得到一个空数组。 (.pop()
方法实际上删除了最后一项。)
最后,确保在加载DOM后没有使用document.write
。如果是这样,您需要将其更改为使用DOM操作方法。
您可以采取不同的方法,这样您根本不需要.pop()
。
DEMO: http://jsfiddle.net/kDtZn/1/
function addToArray(array) {
var item = prompt("Add items to array or 'q' to stop");
if (item == 'q') {
document.body.textContent = array;
} else {
array.push(item);
addToArray(array);
}
}
addToArray([]);
由于原始while
问题导致.pop()
循环无法正常工作的原因很可能。
答案 1 :(得分:1)
您的函数在每个循环/递归上重新创建var array = []。我不确定递归是否适合你工作中的工作 - 它似乎不是这样 - 但是如果你开始使用JavaScript /开发并且只是尝试它那么你就没事了。
答案 2 :(得分:1)
虽然'无限循环'可能是您真正想要的(因为它可能会使代码更简单),但您可以通过默认数组并将其作为参数传递给函数来进行递归。像这样......
function addToArray( array ) {
var array = array || [];
array.push(prompt( "Add items to array or 'q' to stop" ));
if ( array[array.length - 1] === 'q' ) {
document.write(array.slice( 0, -1 ))
} else {
addToArray( array );
}
}
addToArray();
您提供的代码存在两个问题。一,如前所述,每次调用函数时,都要重新定义数组变量。其次,array.pop()会改变你的数组,所以当你进入document.write调用时,无论如何你都要打印一个空数组。