3

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

我阅读了有关使用递归循环的信息。我知道 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技术,但无济于事,数组仍然是空的。另外,为什么通过使用没有参数的函数我不会遇到太多递归?是因为条件语句吗?

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

多谢你们。(和女孩)

4

3 回答 3

6

您正在创建一个新数组,而不是将其传递给递归调用。

改为这样做。

演示: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()方法实际上删除了最后一项。)

最后,确保在document.write加载 DOM 后不使用。如果是这样,您需要将其更改为使用 DOM 操作方法。


你可以采取不同的方法,这样你根本不需要.pop()

演示: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()问题。

于 2013-10-16T02:09:03.980 回答
1

您的函数在每次循环/递归时重新创建 var array = [] 。我不确定递归是否是适合您的工作的正确工具-看起来不像-但是如果您从JavaScript /开发开始并且只是尝试一下,那么您就可以了。

于 2013-10-16T02:07:01.173 回答
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 时,无论如何你都会打印一个空数组。

于 2013-10-16T03:47:37.407 回答