为什么我的递归会引发StackOverflow错误?

时间:2016-06-14 11:18:01

标签: java recursion

我正在尝试生成8-N problem的所有可能状态的树,没有重复。我可以在纸上做,但在代码我不能。

这是我的递归函数:

......
...
..
        root = new TreeNode(startingState);
        visitedStates.add(root.getData().getStateValues());

        generateStateSpaceRecursive(root);
    }

public void generateStateSpaceRecursive(TreeNode node){

    List<TreeNode> nextStatesNodes = getNextStates(node);

    for (TreeNode childNode : nextStatesNodes){
        if(!stateVisited(childNode.getData().getStateValues())) {
            visitedStates.add(childNode.getData().getStateValues());
            node.addChild(childNode);
            generateStateSpaceRecursive(childNode);
        }
    }
}

为什么不停止?

如果我正确地理解了问题,那么

  

实施以下类型的搜索(尝试)解决此问题   问题:深度优先,广度优先,迭代深化,某种形式   启发式搜索。

但我首先需要国家空间吗?或者我可以直接应用算法并生成状态?

编辑:

private List<TreeNode> getNextStates(TreeNode node) {

        List<TreeNode> nextStates = new ArrayList<>();

        if(agent.canMoveLeft(node)){
            nextStates.add(agent.moveLeft(node));
        }
        if(agent.canMoveRight(node)){
            nextStates.add(agent.moveRight(node));
        }
        if(agent.canMoveUp(node)){
            nextStates.add(agent.moveUp(node));
        }
        if(agent.canMoveDown(node)){
            nextStates.add(agent.moveDown(node));
        }

        return nextStates;
    }

2 个答案:

答案 0 :(得分:1)

你的状态太大而无法适应筹码。测试你的算法:

  • 样本较小。
  • 或增加堆栈大小(例如java -Xss4m)

答案 1 :(得分:1)

您应该编辑generateStateSpaceRecursive:

public void generateStateSpaceRecursive(TreeNode node)
{    
 if(!testGoal)
  {
    //Goal node is not seen
    List<TreeNode> nextStatesNodes = getNextStates(node);    
    ...
  }
 else 
   //Goal Node Visited    
}

创建这样的新功能:

private bool testGoal(TreeNode node)
{
  if(node == goalNode) return true;
  else return false;
}