首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免BackTrack算法中函数堆栈内存的使用(n-皇后)

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

Stack Overflow用户
提问于 2012-07-30 19:03:32
回答 1查看 542关注 0票数 0

我在C#上开始了一些编码,并尝试了n的问题,稍微做了一些修改(皇后也有骑士的能力),.After是一个限制,它开始显示由于一次又一次调用该函数而导致的堆栈溢出问题。

请任何人帮助我理解问题,我是facing.Below,是n皇后问题的代码。

代码语言:javascript
运行
复制
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 (由函数返回)是一个数组,它有放置皇后的列号。4皇后的queenPosition是(2->0->3->1).4x4棋盘的位置。
  2. CheckValid函数验证该位置是否合适。
  3. 有一些我不知道的概念,我的记忆被浪费了。
EN

回答 1

Stack Overflow用户

发布于 2012-07-30 19:09:57

试着改变

代码语言:javascript
运行
复制
    if ((queenRow - 1) >= 0 && ((queenPosition[queenRow - 1] + 1) <= size))
    {
       return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);
    }
    else
    {
        return queenPosition;
    }

代码语言:javascript
运行
复制
    if (!((queenRow - 1) >= 0 && ((queenPosition[queenRow - 1] + 1) <= size)))
    {
       return queenPosition;
    }

    return BackTrack(queenRow - 1, queenPosition[queenRow - 1] + 1);

您需要帮助编译器并将其优化尾部 递归

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

很好地阅读了这个问题-- 劳施克咨询公司的Solutions问题解决方案

祝好运!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11727927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档