C# 如何避免回溯算法(n-queens)中的函数堆栈内存使用
我在C#上开始了一些编码,并尝试了n-queen的问题,但略有改变(queen也有骑士能力)。在限制后,由于反复调用函数,它开始显示堆栈溢出问题 有谁能帮我理解我面临的问题吗?下面是n皇后问题的代码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))
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);