3

自分自身を再帰的に呼び出す関数を設計しました。しかし、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 ステートメントは for ループで終了するため、イテレーターの最初の子を通過し、残りは無視されます。

これを解決するには?私も他に方法が思い浮かびません。

4

1 に答える 1

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ますが、この行から返されたオブジェクトを使用しないため、返された再帰オブジェクトは無視されます。メソッドの修正を検証しませんでしたが、ここから開始する必要があります。ところで、子ボードの数が多い場合、この関数は各子で呼び出すと時間がかかる場合があります。

編集:これは、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;
}
于 2012-04-08T14:08:51.760 に答える