为什么数独求解器的这种递归方法不断旋转?

问题描述

| 在学校的作业中,我们应该做一个soduko求解器。我有一个递归方法,应该可以帮助我解决soduko难题。它是这样的:
public void setNumber() {

if (getNext() == null) {

    for (int i = 1; i < 10; i++) {
    if (acceptValue(i)) {
        value = i;
    }
    }
    board.stopRec();
    return; 

} else { 


    if(predefined()) { // if the square allready has a number
    getNext().setNumber();
    } else { // find value for undefined square

    for (int i = 1; i < 10; i++) {
        if (acceptValue(i)) {
        value = i // Does the Row class take notice of this?
        getNext().setNumber();
        }
    }
    /* no value was assigned */
    value = -1;

    }

}

}
Board类具有initGrid方法,该方法创建所有Square并使用nextSquare引用将它们链接在一起
class Board {

[...]

public void initGrid(int nSquaresBoxRowCol,int nRowsBox,int nColsBox,int[][] values) {

[...]

/* Create the rows,columns and squares */
Square prev = null;
for (int row = 1; row <= nRowsBoard; row++) {

    //Row r = new Row(row,squares[row-1]);
    Row r = new Row(row);
    rows[row-1] = r;

    for (int col = 1; col <= nColsBoard; coL++) {
    if (row == 1) {
        Column c = new Column(col);
    }

    Square current = new Square(row,col,Math.ceil((float)row / (float)nRowsBox),Math.ceil((float)col / (float)nColsBox),values[row-1][col-1],r,this);

    if (!((row-1) == 0 && (col-1) == 0)) {
        prev.nextSquare = current;
    }

    prev = current;
    squares[row-1][col-1] = current;

    r.addSquare(current);

    /* Fill the Boxes with squares */
    Boxes[(int)(Math.ceil((float)row / (float)nRowsBox)) - 1][(int)(Math.ceil((float)col / (float)nColsBox)) - 1].addSquare(squares[row-1][col-1]);
    nSquares++;

    }

} // END for (int row ...
Row类的对象希望将添加到它们的正方形对象保存在Board类的initGrid方法中。
class Row {
int id;

Square[] squares;
ArrayList<Square> squareList;

Row(int id) {
this.id = id; // not currently used for anything
squareList = new ArrayList<Square>();
}

boolean checkValue(int val) {
System.out.println(\"Checking values for row \" + id);    
Iterator<Square> iter  = squareList.iterator();
while(iter.hasNext()) {
    System.out.println(\"Value (boolean checkValue() in Row): \" + iter.next().value);
    if (iter.next().value == val) {
    System.out.println(\"returned false\");
    return false;
    }
}
return true;

}

public void addSquare(Square s) {
squareList.add(s);
System.out.println(\"class Row,method addSquare: Square with value \" + s.value + \" added to row.\");
}
} 关于半递归方法方法在Square类内部,所有正方形都组装成二维数组。该方法假设针对数独板上的每个方块调用自己。所有正方形都有一个Square nextSquare指针,该指针指向squares [] []中的下一个正方形。 getNext()返回nextSquare。 acceptValue(i)检查Squares'Row以查看是否存在带有i值的Square对象,如果不存在,则返回true(Row有一个square [],其squares分配给它从董事会) 我真的以为这可以解决问题,但是复发只会持续不断。 我唯一能想到的是,行对象中的正方形可能不会在递归中进行值更新,而这可能会导致递归方法永远持续下去。但是我仍然不明白为什么这样做会有意义,根据数独规则它应该给我错误的值。 请告知我是否应该包括更多代码。 任何建议,不胜感激。谢谢。     

解决方法

好吧,如果您的所有其他代码都能按预期运行,并且
acceptValue(i)
每次都会正确选择,那么您会想在
getNext().setNumber();
之后返回 就像是
for(i=1;i<10;i++){
    if(acceptValue(i)){
        value = i;
        getNext().setNumber();
        return;
    }
}
否则,如果代码在
setNumber()
返回时选择2作为值,它将尝试3、4、5 ...,依此类推。