我开始对C#进行编码并尝试轻微更改n-queen的问题(女王也有骑士力量)。在限制之后,由于一次又一次地调用该函数,它开始显示stackoverflow问题。
有没有人可以帮助我理解我面临的问题。下面是n-queens问题的代码。
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;
}
}
这里queenPosition
(由函数返回)是数组
有女王所在的列号。像queenPosition
一样
对于4-queen将是(2-> 0-> 3-> 1)。 4x4棋盘中的位置。
CheckValid
函数验证该职位是否合适。
有些概念我不知道,而且记忆力也被浪费了。
答案 0 :(得分:-1)
尝试更改
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) <= size)))
{
return queenPosition;
}
return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);
您需要帮助编译器并optimize将其发送到tail recursion。
它可能根本没有得到优化,这取决于参数和返回值,但值得一试。
祝你好运!