Javascript递归循环项到数组

时间:2013-10-16 02:01:33

标签: javascript arrays recursion prompt

我正在尝试制作一个小程序,提示用户将商品添加到购物清单。

我读到了使用递归循环。我理解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的函数我没有遇到过多的递归?是因为条件陈述吗?

如果你知道我做错了什么,试着找出正确的答案,而不是只是脱口而出。我想要那个“啊哈”的时刻。我认为这一切都有助于我们更好地学习。

谢谢你们。 (和女孩)

3 个答案:

答案 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调用时,无论如何你都要打印一个空数组。