2012-04-08 4 views
3

Я разработал функцию, которая рекурсивно называет себя. Но оператор return не делает того, что я хочу, чтобы он делал. Мы проверили с печатью, что возвращение достигнуто, но оно не возвращается к исходной функции. В заявлении он входит:Возвращаемое значение в рекурсивной функции JAVA

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

Println показывает вверх отлично, но когда рь возвращается все становится странно.

Когда он возвращается к функции:

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(), (глубина-1)); он проходит через каждого ребенка по назначению, но не сохраняет значение из-за отсутствия возврата. Когда я использую return before, он просто проходит через первого дочернего элемента в итераторе и игнорирует остальное, потому что операторы return заканчиваются для циклов.

Как это решить? Я тоже не могу думать о другом.

+0

Вы должны также Google для собраний Java кодирования. –

ответ

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, если количество детских досок велико, эта функция может занять много времени, как вы ее называете на каждого ребенка.

EDIT: Это exmaple того, как вы можете справиться с возвращаемые доски из ваших 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; 
} 
+0

Спасибо за ваши взгляды. Проблема в том, что, когда я использую return infront из DLS (tmp, (depth-1)), он просто кажется, что оценивает первый из дочерних направлений в векторе. Как это решить? Я понятия не имею. Может быть, я немного смущен ... – user1319951

+0

Я не знаю структуру puzzleBoard, но я думаю, что доски, возвращенные из DLS в этот момент, должны быть вставлены как дочерние элементы в текущий объект puzzleBoard. – giorashc

+0

Итак, для экспериментальных целей я создал глобальную переменную (!), Но все еще не работает должным образом. Я распечатываю, чтобы проверить, что эта переменная, результат, имеет правильное значение. Сразу после этого DLS() должен закончить (и ничего не возвращать), и результат должен сохранить его значение. По-видимому, это не идеи, почему? – user1319951

Смежные вопросы