0

Java の for ループに問題があります。反復ディープ検索を実行しようとしていますが、深さ n で子を生成するコードは次のようになります。

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

return ステートメントを使用しない場合、DLS は本来あるべき動作を行いますが、return ステートメントがないため、呼び出し元の関数に値が到達しません。return DLS(...) を使用すると、イテレータが生成する最初の値が返されます。これを解決するには?DLS 全体と呼び出し元関数を以下に貼り付けます。

private puzzleBoard IDS(String initial){
    puzzleBoard pb = new puzzleBoard(initial,0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());

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

private puzzleBoard DLS(puzzleBoard pb, int depth){

    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();){
            DLS(child.next(),(depth-1));
        }
    }
    else
        return new puzzleBoard("999999999",0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
    return pb;
}
4

2 に答える 2

1

私が間違っているかもしれませんが、 for ループは、実際に関数DLS(puzzleBoard pb, int depth)を初めて呼び出す外部に配置する必要があると思います.....else if唯一の呼び出し の内部DLS(pb,depth);

于 2012-04-09T05:23:21.173 に答える
1

イテレータのすべての要素をループしてDLSそれぞれを呼び出していますが、ループ内の最初の要素に対して呼び出した結果を返し、他のすべての要素をバイパスします。DLSループ内のすべての呼び出しから返された値をどのように結合するかを決定する必要があります。

null各要素を呼び出した後に戻りたいだけの場合は、ループの後にステートメントをDLS追加します。return

else if (depth>0) {
    for (...) {
        DLS(...);
    }
    return null;
}
于 2012-04-09T05:48:26.993 に答える