Проблема возврата Java - PullRequest
       19

Проблема возврата Java

1 голос
/ 21 октября 2010
  public void question(int col, int n, Node<Integer> part_soln) {
        if (col==0) stack.push(part_soln);
        else for (int row=1; row<=n; row++)
              { if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) 
                  { Node<Integer> new_soln = new Node<Integer>(row,part_soln);
                    question(col-1,n,new_soln);
                  }
              }
    }  

я вставлял part_soln в стек, но теперь я хочу получить первый part_soln вместо стека, я разорву цикл, как только получу part_soln, я изменю вопрос так:

  public void question(int col, int n, Node<Integer> part_soln) {
        if (col==0) return part_soln;
        else for (int row=1; row<=n; row++)
              { if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) 
                  { Node<Integer> new_soln = new Node<Integer>(row,part_soln);
                    question(col-1,n,new_soln);
                  }
              }
return null;
}

проблема возникает, я не могу получить первый элемент в стеке, но продолжаю получать "ноль" в качестве ответа, любое предложение?

1 Ответ

2 голосов
/ 21 октября 2010

Во второй версии question() у вас есть только два оператора return, а второй возвращает null всякий раз, когда col != 0.

Таким образом, вы, кажется, испортили свою схему рекурсии, потому что даже если question() вызывает себя рекурсивно внутри цикла, возвращаемое значение не используется.

Было бы полезно узнать, что должен делать метод. Но в любом случае, моя попытка исправить это на основе предоставленной вами информации (вы хотите найти и вернуть первое подходящее решение)

public Node<Integer> question(int col, int n, Node<Integer> part_soln) {
    if (col==0) 
        return part_soln;
    else for (int row=1; row<=n; row++) {
        if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) {
            Node<Integer> new_soln = new Node<Integer>(row,part_soln);
            Node<Integer> ret = question(col-1,n,new_soln);
            if (ret != null)
                return ret;
        }
    }
    return null;
}

Разница в том, что я сохраняю возвращаемое значение от рекурсивного вызова, и если оно не null, немедленно возвращаю его.

...