2017-10-15 16 views
0

Espérons que ce n'est pas trop difficile une question sans contexte, mais ici rien ne va. Donc, j'ai hérité de ce code de quelqu'un, et je n'arrive pas à le faire fonctionner!Méthode récursive Réduire dans ES6/Immutable

Nous faisons un jeu de Go. Nous voulons scanner un ensemble de pièces sur le tableau et voir si elles sont vides ou non. Un carré vide s'appelle une «liberté». Maintenant, au bas de la fonction, nous créons un nouveau tableau 2D 'visitedBoard' qui garde la trace de l'endroit où nous avons scanné jusqu'à présent. PROBLEME, la mise en œuvre actuelle permet de scanner deux fois les libertés! Il semble seulement marquer quelque chose comme «visité» dans le tableau quand il est vide ou une autre couleur (0), pas quand il est 1.

BTW, en bas - nous itérons à travers les voisins, ce qui est un tableau d'objets de 4 éléments {row: 2, col: 3}, puis l'exécute récursivement à travers cette fonction.

Toute aide est utile. Je suis nouveau dans cette entreprise fonctionnelle/immuable.

const getLiberties = function (board, point, color) { 

if (board.get(point.row).get(point.col) === C.VISITED) { 
return 0; // we already counted this point 

} else if (board.get(point.row).get(point.col) === C.EMPTY) { 
return 1; // point is a liberty 

} else if (board.get(point.row).get(point.col) !== color) { 
return 0; // point has an opposing stone in it 
} 

const neighbours = getNeighbours(board, point) 
const visitedBoard = board.setIn([point.row, point.col], C.VISITED) 

return neighbours.reduce(
(liberties, neighbour) => liberties + getLiberties(visitedBoard, 
neighbour, color), 0)} 

Répondre

0
  1. au lieu de .get(point.row).get(point.col) vous pouvez utiliser .getIn([point.row, point.col])

  2. réduire l'intérieur que vous utilisez toujours même visitedBoard pour tous les appels. Vous devez réattribuer une nouvelle valeur à la variable après appel rappel de réduire

enter image description here