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

时间:2012-07-30 19:03:33

标签: c# stack-overflow n-queens

我开始对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;
    }
}
  1. 这里queenPosition(由函数返回)是数组 有女王所在的列号。像queenPosition一样 对于4-queen将是(2-> 0-> 3-> 1)。 4x4棋盘中的位置。

  2. CheckValid函数验证该职位是否合适。

  3. 有些概念我不知道,而且记忆力也被浪费了。

1 个答案:

答案 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

它可能根本没有得到优化,这取决于参数和返回值,但值得一试。

关于此问题的良好解读N-Queens Problem Solutions by Lauschke Consulting

祝你好运!