C# 递归堆栈溢出异常

C# 递归堆栈溢出异常,c#,recursion,stack-overflow,C#,Recursion,Stack Overflow,我试图做一个数独解算程序,我有一个StackOverflow异常问题。我不知道该怎么做才能解决这个问题,因为这个算法很好,如果只有几个递归函数,它就可以工作。我试图用try-catch解决这个问题,但我不是很擅长。下面是代码,如何使其正常工作而不出现StackOverflow错误 public static int Rezolva_sudoku(int i,int j,int[,] cells, int[,] cells2) { try {

我试图做一个数独解算程序,我有一个StackOverflow异常问题。我不知道该怎么做才能解决这个问题,因为这个算法很好,如果只有几个递归函数,它就可以工作。我试图用try-catch解决这个问题,但我不是很擅长。下面是代码,如何使其正常工作而不出现StackOverflow错误

public static int Rezolva_sudoku(int i,int j,int[,] cells, int[,] cells2)
    {
        try
        {

            int ok = 0;
            int val;
            if (j == 10)
            {
                j = 1;
                i++;
            }
            if (i == 10)
            {
                for (int m = 1; m <= 9; m++)
                    for (int p = 1; p <= 9; p++)
                        if (cells[m, p] != 0)
                            ok = 1;
                if (ok == 1)
                    return 1;
                else
                    return 0;
            }

            if ((cells[i, j] == cells2[i, j]) && back == 0)
                if (j == 1)
                    return Rezolva_sudoku(i - 1, 9, cells, cells2);
                else
                    return Rezolva_sudoku(i, j - 1, cells, cells2);
            if (i != 10)
            {
                back = 1;
                if (cells[i, j] == cells2[i, j] && back == 1)
                    return Rezolva_sudoku(i, j + 1, cells, cells2);
                for (val = cells[i, j] + 1; val <= 9; val++)
                {
                    if (legal(i, j, val, cells))
                    {

                        cells[i, j] = val;
                        return Rezolva_sudoku(i, j + 1, cells, cells2);

                    }


                }
            }
            if (i != 10)
            {
                if (j == 1)
                {
                    back = 0;
                    cells[i, j] = 0;
                    return Rezolva_sudoku(i - 1, 9, cells, cells2);
                }
                else
                {
                    if (cells[i, j - 1] == cells2[i, j - 1])
                    {
                        if (j == 2)
                        {
                            if (cells[i - 1, 9] == cells2[i - 1, 9])
                            {
                                back = 0;
                                cells[i, j] = 0;
                                return Rezolva_sudoku(i - 1, 8, cells, cells2);
                            }
                            else
                            {
                                back = 0;
                                cells[i, j] = 0;
                                return Rezolva_sudoku(i - 1, 9, cells, cells2);
                            }
                        }
                        else
                        {
                            back = 0;
                            cells[i, j] = 0;
                            return Rezolva_sudoku(i, j - 2, cells, cells2);
                        }
                    }
                    back = 0;
                    cells[i, j] = 0;
                    return Rezolva_sudoku(i, j - 1, cells, cells2);

                }


            }

        }
        catch (StackOverflowException e)
        {
            MessageBox.Show(e.ToString());
        }
        return 0;
    }
public static int Rezolva_数独(int i,int j,int[,]单元格,int[,]单元格2)
{
尝试
{
int ok=0;
int-val;
如果(j==10)
{
j=1;
i++;
}
如果(i==10)
{

对于(int m=1;m,问题是堆栈空间不足

每次调用函数时,都会将一些数据放在堆栈上,当函数结束时,这些数据会再次被删除

当一个函数递归地调用自身时,每次调用自身时,都会有更多的数据放在堆栈上,并且在其中一个结束之前,这些数据都不会从堆栈中取出

你的问题是,这会很快填满堆栈,当堆栈空间用完时,程序会崩溃。递归函数在某些方面很有用,但前提是它们不需要重复太多次


现在有好消息和坏消息:好消息是这是可以修复的,但坏消息是修复它的最好方法是完全重写您的程序,这样它就可以使用循环而不是递归函数来工作。

您是否尝试过增加java的分配内存?如果您的代码正在处理小的suduko难题,而不是大的难题,请不要当问题只是递归算法需要使用大量内存,而java正在耗尽时。我不知道怎么做,这就是为什么我没有尝试。你能告诉我怎么做吗?这是在Visual Studio C中制作的。哦,你在使用C,我们去谷歌“如何增加Visual Studio C分配的内存”还有其他的解决方案吗?其他的解决方案是不要使用递归,或者你需要找到一个更有效的递归算法。