在递归函数JAVA中返回值

时间:2012-04-08 13:59:04

标签: java search return

我设计了一个递归调用自身的函数。但是,return语句没有按照我的意愿去做。我们已经检查了印刷品是否达到了回报,但它没有回到初始功能。 它进入的声明:

if(depth==0 && pb.isGoalState()){
            System.out.println("!!!!!WOOOOOW!!!!!");
            return pb;
}

println显示正常,但是当pb返回时,事情变得很奇怪。

当它回到功能时:

result = DLS(pb,depth); //never returns here!!!
System.out.println("Here: "+result.toString());

它永远不会打印出上面的印刷品。我没有看到什么是错的!我已经检查了我自己设计的其他方法。

private puzzleBoard IDS(String initial){
        puzzleBoard pb = new puzzleBoard(initial,0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
        int depth=0;
        puzzleBoard result=new puzzleBoard("999999999",0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
        while(true){//Repeat
            System.out.println("DP "+depth);
            result = DLS(pb,depth);
            System.out.println("Here: "+result.toString());
            if(result.isGoalState())
                return result;
            depth++;
        }

        }

    private puzzleBoard DLS(puzzleBoard pb, int depth){
        System.out.println("AVskilj depth "+depth+" "+(depth==0 && pb.isGoalState()));
        pb.printPuzzle();
        if(depth==0 && pb.isGoalState()){
            System.out.println("!!!!!WOOOOOW!!!!!");
            return pb;
        }
        else if(depth>0){
            for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
                puzzleBoard tmp;
                tmp=child.next();
                tmp.printPuzzle();
                DLS(tmp,(depth-1));
            }

        }
        else
            return new puzzleBoard("999999999",0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
        return pb;
        }

所以我的问题现在仍然在代码的这一部分

for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
                DLS(child.next(),(depth-1));
            }

当我不使用DLS之前的返回(child.next(),(depth-1));它会按预期通过每个孩子,但由于缺少回报而不会存储该值。当我在它之前使用return时,它只是遍历迭代器中的第一个子节点并忽略其余子节点,因为return语句终止于循环。

如何解决这个问题?我也想不出另一种方式。

1 个答案:

答案 0 :(得分:3)

在此次迭代中:

   for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
                puzzleBoard tmp;
                tmp=child.next();
                tmp.printPuzzle();
                DLS(tmp,(depth-1));
            }

看看行:

DLS(tmp,(depth-1));

DLS返回puzzleBoard对象,但您不使用此行返回的对象,因此返回的递归对象将被忽略。我没有验证你的方法的更正,但你应该从这里开始。和BTW如果儿童板的数量很大,这个功能可能需要很长时间才能给每个孩子打电话。

编辑:这是您如何处理DLS退回的电路板的例子:

 else if(depth>0){
       for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
                    puzzleBoard tmp;
                    tmp=child.next();
                    tmp.printPuzzle();
                    puzzleBoard resultPB = DLS(tmp,(depth-1));

                    // mergre resultPB with current puzzle board (e.g. pb.addChild(resultPB));
                }

       return pb;
}