簡體   English   中英

我如何避免BackTrack算法中的函數堆棧內存使用(n個女王)

[英]How do i avoid the function stack memory usage in BackTrack algorithm (n-queens)

我在C#上開始了一些編碼,並嘗試了n-queen的問題(稍有變化)(queen也具有騎士力量)。在限制之后,由於一次又一次地調用該函數,它開始顯示stackoverflow問題。

任何人都可以幫助我理解我面臨的問題。下面是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;
    }
}
  1. queenPosition (由函數返回)是一個數組,該數組具有放置女王的列號。 queenPosition的4-queen將是(2-> 0-> 3-> 1)。 4x4棋盤中的位置。

  2. CheckValid函數驗證該位置是否合適。

  3. 有一些我不知道的概念,內存正在浪費。

嘗試改變

    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);

您需要幫助編譯器並將其優化 遞歸

它可能根本沒有得到優化,這取決於參數和返回值,但是值得一試。

Lauschke Consulting撰寫的有關此問題的N-Queens問題解決方案的好書

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM