为什么我在Sudoku Solver C#中不断收到Stackoverflow错误

时间:2018-12-07 12:25:11

标签: c# recursion runtime-error stack-overflow sudoku

编辑:我真的很抱歉。我的错误在那里

    //get unassigned position 
    unassignedPos = GetNextUnassignedValue(matrix);
    int col = unassignedPos.Item1;
    int row = unassignedPos.Item2;

行必须是item1,col必须是item2 ...还发现我尝试了无法正确解决的数独问题。

我是C#的新手,刚刚开始更深入地进行编码。有谁知道为什么我在以下代码示例中不断收到Stackoverflow错误?我仔细检查并重新排列了约束,它们应该没问题。

    class SudokuCalc
{
    (int, int) finish = (9, 9);
    (int, int) unassignedPos = (0, 0);

    //method to recursively solve the sudoku
    public bool Solve(int[,] matrix)
    {
        //if we are at the finish position return true
        if (finish.Item1 == GetNextUnassignedValue(matrix).Item1
            && finish.Item2 == GetNextUnassignedValue(matrix).Item2)
        {
            return true;
        }
        //get unassigned position 
        unassignedPos = GetNextUnassignedValue(matrix);
        int col = unassignedPos.Item1;
        int row = unassignedPos.Item2;

        //go through all possible values
        for (int value = 1; value <= 9; value++)
        {
            if (IsValid(matrix, row, col, value))
            {
                matrix[row, col] = value;
                //recursively try to solve
                if (Solve(matrix))
                {
                    return true;
                }
                // if we couldnt solve the sudoku
                // set the previous value 0 and try again
                matrix[row, col] = 0;
            }
        }
        return false;
    }

1 个答案:

答案 0 :(得分:0)

在当前情况下,StackOverflow异常意味着您的Solve方法递归调用自身太多次。发生这种情况时,您可以停止调试器,并查看带有大量嵌套Solve调用的所有堆栈跟踪。

在某些情况下,您的情况会迫使代码无限调用Solve方法。要进行跟踪,您可以在Solve方法的开头添加日志记录,并写入调用您的磁盘矩阵。也许到某个时候,您会一次又一次获得相同的价值。