C# 如何避免回溯算法(n-queens)中的函数堆栈内存使用

C# 如何避免回溯算法(n-queens)中的函数堆栈内存使用,c#,stack-overflow,n-queens,C#,Stack Overflow,N Queens,我在C#上开始了一些编码,并尝试了n-queen的问题,但略有改变(queen也有骑士能力)。在限制后,由于反复调用函数,它开始显示堆栈溢出问题 有谁能帮我理解我面临的问题吗?下面是n皇后问题的代码 private int[] BackTrack(int queenRow, int column) { for (int i = column; i < size; i++) { if (CheckValidMove(queenRow, i))

我在C#上开始了一些编码,并尝试了n-queen的问题,但略有改变(queen也有骑士能力)。在限制后,由于反复调用函数,它开始显示堆栈溢出问题

有谁能帮我理解我面临的问题吗?下面是n皇后问题的代码

private int[] BackTrack(int queenRow, int column)
{
    for (int i = column; i < size; i++)
    {
        if (CheckValidMove(queenRow, i))
        {
            queenPosition[queenRow++] = i;
            if (queenRow < size)
                return BackTrack(queenRow, 0);
            else
            {
                done = true;
                return queenPosition;   
            }
        }
        else
            continue;
    }
    if ((queenRow - 1) >= 0 && ((queenPosition[queenRow - 1] + 1) <= size))
    {
        return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);
    }
    else
    {
        return queenPosition;
    }
}
private int[]回溯(int queenRow,int column)
{
for(int i=列;i=0&((queenPosition[queenRow-1]+1)0->3->1)。4x4棋盘中的位置

  • CheckValid
    功能验证位置是否合适

  • 有一个我不知道的概念,我的记忆被浪费了

  • 尝试改变

        if ((queenRow - 1) >= 0 && ((queenPosition[queenRow - 1] + 1) <= size))
        {
           return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);
        }
        else
        {
            return queenPosition;
        }
    

    if((queenRow-1)>=0&&((queenPosition[queenRow-1]+1)=0&((queenPosition[queenRow-1]+1)Oops!在开始时没有看到递归调用:返回回溯(queenRow,0);无论如何,你明白了。将递归调用移到函数末尾,并确保它只有一个。C#编译器没有优化以使用尾部调用递归。更改了答案。我假设他们在4.0中完成了此操作。
    
        if (!((queenRow - 1) >= 0 && ((queenPosition[queenRow - 1] + 1) <= size)))
        {
           return queenPosition;
        }
    
        return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);