递归跳过值

时间:2019-08-31 14:27:50

标签: javascript arrays recursion

我正在尝试将一组数字随机分配/放置在新数组中成对:[1,2,3,4,5,6,7,8]应该等于[[1,1],[8,8],[3,3],[7,7],[2,2],[4,4],[5,5],[6,6]]

let numbers = [1,2,3,4,5,6,7,8]

let arrayToBeFilled = [];

function assign(num) {

 let randomNumber =  Number(Math.floor((Math.random() * 8)));

  if(arrayToBeFilled[randomNumber] == null ) {

    arrayToBeFilled[randomNumber] = [num, num] ;

  } else if (arrayToBeFilled[randomNumber] == Array) {

   return  assign(num);

  } else {

    console.log('Trying a new number');

  }
}

  for (num in numbers) {

    assign(Number(num));

  }

 console.log(arrayToBeFilled);  
 return arrayToBeFilled;

返回数组,但在递归应填满数组的位置缺少值(至少是我期望的值)。请参阅<1空项目>。

Trying a new number
Trying a new number
Trying a new number
[ [ 0, 0 ], [ 7, 7 ], [ 5, 5 ], <1 empty item>, [ 2, 2 ], [ 1, 1 ] ]

任何人都知道为什么会这样吗?

5 个答案:

答案 0 :(得分:1)

我对您的代码进行了一些编辑:

/* prefer functions instead of global variables */
function main() {
  let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
  let arrayToBeFilled = [];

  for (num of numbers) { /* Use 'for...of' syntax for array iteration */
    assign(Number(num), arrayToBeFilled);
  }

  return arrayToBeFilled
}

function assign(num, arr) {
  const randomNumber = Number(Math.floor((Math.random() * 8)));
  if (arr[randomNumber] == null) {
    arr[randomNumber] = [num, num];
  } else if (Array.isArray(arr[randomNumber])) { /* Proper way to check if element is an Array type */
    return assign(num, arr);
  } else {
    return []
  }
}

console.log(main());

答案 1 :(得分:1)

这是我的看法。当然,这样做的好处是可以在所有数组上使用shuffle函数形式的抽象,并且可以将其放入实用程序子文件中。

function shuffle(a) {
    // you can replace this with "let n = a" if you don't care about  
    // the incoming array being altered
    let n = [...a]; 
    for (let i = n.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [n[i], n[j]] = [n[j], n[i]];
    }
    return n;
}

let numbers = [1,2,3,4,5,6,7,8];
console.log( shuffle( numbers ).map( n => [n,n] ) );

答案 2 :(得分:0)

不可重复的随机数https://jsfiddle.net/th3vecmg/2/

let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
let arrayToBeFilled = [];

function assign(numbers, i, size) {

  if (i < size) {
    assign(numbers, ++i, size);
  }

  var randomNumber = numbers[Math.floor(Math.random() * numbers.length)];
  arrayToBeFilled.push([randomNumber, randomNumber]);
  numbers.splice(numbers.indexOf(randomNumber), 1);
}

assign(numbers, 0, numbers.length - 1)

console.log(arrayToBeFilled);

重复随机数https://jsfiddle.net/th3vecmg/3/

let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
let arrayToBeFilled = [];

function assign(numbers, i) {
  let randomNumber = Number(Math.floor((Math.random() * 8)));
  arrayToBeFilled[i] = [randomNumber, randomNumber];

  if (i < numbers.length - 1) {
    assign(numbers, ++i);
  }
}

assign(numbers, 0)
console.log(arrayToBeFilled);

答案 3 :(得分:0)

您可以创建将元素随机化的函数,并使用while循环为每个元素返回第n个长度的数组。

let numbers = [1, 2, 3, 4, 5, 6, 7, 8]

function randomize(data, n) {
  const result = [];
  data = data.slice();

  while (data.length) {
    const pos = Math.floor(Math.random() * data.length);
    const el = data.splice(pos, 1).pop();
    result.push(Array.from(Array(n), () => el));
  }

  return result;
}

console.log(randomize(numbers, 2))
console.log(randomize(numbers, 4))

答案 4 :(得分:0)

尝试以下操作:

function assign(num) {

 let randomNumber =  Number(Math.floor((Math.random() * 8)));

  if(arrayToBeFilled[randomNumber] == null ) {

    arrayToBeFilled[randomNumber] = [num + 1, num + 1] ;

  } else {

   assign(num);

  }
}

您在代码中还有另一个,它跳过了要填充的数组中的一个位置