ES6中的递归Reduce方法/不可变

时间:2017-10-15 00:53:59

标签: javascript recursion reduce immutable.js

希望这不是一个没有背景的问题,但这里什么都没有。所以,我从某人那里继承了这段代码,而我似乎无法让它发挥作用!

我们正在制作Go游戏。我们想要扫描板上的一组件,看看它们是否是空的。空方块被称为“自由”。现在,在函数的底部,我们正在创建一个新的2D数组'visitedBoard',用于跟踪我们到目前为止扫描的位置。

问题,当前的实现允许自由扫描两次!当它是空的或其他颜色(0)时,它似乎只是在板上标记为“已访问”,而不是在它为1时。

BTW,在底部 - 我们正在遍历邻居,这是一个4项对象数组{row:2,col:3}然后通过这个函数递归运行它。

任何帮助都有帮助。我是这个功能/不可变业务的新手。

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)}

1 个答案:

答案 0 :(得分:0)

  1. 而不是.get(point.row).get(point.col)您可以使用.getIn([point.row, point.col])

  2. 内部减少你总是使用相同的visitBoard进行所有调用。在减少回调调用

  3. 之后,您必须为变量重新分配新值

    enter image description here