石头剪刀布递归

Rock Paper Scissors Recursion

本文关键字:递归 石头剪刀布      更新时间:2023-09-26
var rockPaperScissors = function(rounds) {
  var outcomes = [];
  var plays = ['rock', 'paper', 'scissors'];
  var playedSoFar = [];
  var combos = function(roundsToGo) {
    // base case
    if (roundsToGo === 0) {
      outcomes.push(playedSoFar.slice());
      return;
    }
    for (var i = 0; i < plays.length; i++) {
      playedSoFar.push(plays[i]);
      combos(roundsToGo - 1);
      playedSoFar.pop();
    }
  };
  combos(rounds);
  return outcomes;
};
console.log(rockPaperScissors(2));

如果我从playedSoFar中取出slice(),则outcomes只是返回为9个空数组,而不是2轮石头剪刀布游戏中的所有组合:

[ [ 'rock', 'rock' ],
  [ 'rock', 'paper' ],
  [ 'rock', 'scissors' ],
  [ 'paper', 'rock' ],
  [ 'paper', 'paper' ],
  [ 'paper', 'scissors' ],
  [ 'scissors', 'rock' ],
  [ 'scissors', 'paper' ],
  [ 'scissors', 'scissors' ] ]

当我从playedSoFar中取出slice()时,为什么不工作?

.slice()返回数组的副本,如果您不使用.slice()而只是推playedSoFar数组,则其更新的内容将在整个范围内反映,因此它们将反映在combos数组中。

如果您想保留playedSoFar,那么可以这样做:

  outcomes=outcomes.concat(playedSoFar);