正确的递归

时间:2018-08-31 16:16:40

标签: javascript

我正在尝试编写一个应返回6个元素的列表的函数。它应该使用一个空数组,一个“模式”,在这里必须“添加”,以及第三个参数,即后一个元素应该增加的数字(与之前的元素相比)。 例如,返回的数组可能类似于

[4, 6, 8, 10, 12, 14]

http://jsbin.com/vuvunotifu/edit?js,console

我在JsBin上进行了测试,但是在最后一个if块中似乎有一个stackoverflow(没有双关语)。不知道为什么。有人知道如何解决吗?

  function getRandomInt(max){
  return Math.floor(Math.random() * Math.floor(max));
}


function getSequence(array, mode, differBy){
  if(mode === 'add'){
    if (array.length >= 6){
      return array;
    }
    if (array.length === 0){
      array.push(getRandomInt(getRandomInt(20)));
      getSequence(array, 'add', getRandomInt(2) + 1);
      console.log(array)
    }
    if (array.length <= 5){
      let arrayCopy = array;
      let lastInArray = arrayCopy.pop();
      array.push(lastInArray + differBy);
      getSequence(array, 'add', differBy);
    }
  }
}

console.log(getSequence([], 'add'));

3 个答案:

答案 0 :(得分:1)

问题是您没有在复制数组-您只是(基本上)设置了对同一数组的另一个引用。因此[31mFailed to evaluate expression: ...[0m 也会更改变量arrayCopy.pop()的显示,从而使array永远不会增长。

要更正您的代码(使其与代码尽可能接近),可以使用array来制作数据的实际副本。

或者,更简单的解决方案是使用array.slice()设置lastInArray

请参见

https://medium.com/@naveenkarippai/learning-how-references-work-in-javascript-a066a4e15600

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

答案 1 :(得分:0)

let arrayCopy = array;实际上不是在复制数组,因此当您弹出一个项目时,它只是从原始数组中消失了。数组的长度根本不增加。您完全不需要弹出该项目。

function getSequence(array, mode, differBy){
  if(mode === 'add'){
    if (array.length >= 6){
      return array;
    }
     if (array.length === 0){
       array.push(getRandomInt(getRandomInt(20)));
       getSequence(array, 'add', getRandomInt(2) + 1);
       console.log(array)
    }
    if (array.length <= 5){      
      let lastInArray = array[array.length-1];
      array.push(lastInArray + differBy);
      getSequence(array, 'add', differBy);
    }
  }
}

getSequence([], 'add');

答案 2 :(得分:0)

共享代码的问题出在let arrayCopy = array;,这里不是创建新数组,而是将arrayCopy引用到同一数组,所以当您pop()这一个,它也pop()另一个。

要使用另一个数组的副本创建一个新数组,应使用array.slice()。更改似乎可以使您的代码正常工作。