C# 如何编写这个递归算法以减少内存消耗?

C# 如何编写这个递归算法以减少内存消耗?,c#,windows-phone-7,recursion,stack-overflow,C#,Windows Phone 7,Recursion,Stack Overflow,我正在尝试为Windows Phone创建我自己的WordSearch游戏,我找到了一个解决这个问题的算法。我的问题是算法使用递归,在6-8次调用之后,我得到了一个StackOverflowException 数组:char[,]包含二维表的字符 i、 a:阵列中当前位置的坐标 宽度、高度:数组的大小 build:我们试图创建的字符串(单词本身) covered:bool[,]表示已使用的字符 以下是算法: ... enum WordType : byte { Ful

我正在尝试为Windows Phone创建我自己的WordSearch游戏,我找到了一个解决这个问题的算法。我的问题是算法使用递归,在6-8次调用之后,我得到了一个StackOverflowException

  • 数组:char[,]包含二维表的字符
  • i、 a:阵列中当前位置的坐标
  • 宽度、高度:数组的大小
  • build:我们试图创建的字符串(单词本身)
  • covered:bool[,]表示已使用的字符
以下是算法:

...
enum WordType : byte
    {
        FullWord,
        PartialWord,
        FullWordAndPartialWord
    }  
...
static Dictionary<string, WordType> _words = new Dictionary<string, WordType>();
static Dictionary<string, bool> _found = new Dictionary<string, bool>();

void Search(char[,] array, int i, int a, int width, int height, string build, bool[,] covered)
        {            
            if (i >= width || i < 0 || a >= height || a < 0)
            {
                return;
            }            
            if (covered[a, i])
            {
                return;
            }

            char letter = array[a, i];

            string pass = build + letter;            
            WordType value;
            if (_words.TryGetValue(pass, out value))
            {                
                if (value == WordType.FullWord ||
                value == WordType.FullWordAndPartialWord)
                {                    
                    if (!_found.ContainsKey(pass))
                    {                        
                        _found.Add(pass, true);
                    }
                }

                if (value == WordType.PartialWord ||
                value == WordType.FullWordAndPartialWord)
                {

                    bool[,] cov = new bool[height, width];
                    for (int i2 = 0; i2 < width; i2++)
                    {
                        for (int a2 = 0; a2 < height; a2++)
                        {
                            cov[a2, i2] = covered[a2, i2];
                        }
                    }

                    cov[a, i] = true;

                    Search(array, i + 1, a, width, height, pass, cov);
                    Search(array, i, a + 1, width, height, pass, cov);
                    Search(array, i + 1, a + 1, width, height, pass, cov);
                    Search(array, i - 1, a, width, height, pass, cov);
                    Search(array, i, a - 1, width, height, pass, cov);
                    Search(array, i - 1, a - 1, width, height, pass, cov);
                    Search(array, i - 1, a + 1, width, height, pass, cov);
                    Search(array, i + 1, a - 1, width, height, pass, cov);
                }
            }
        }
。。。
枚举字类型:字节
{
全文,
一句话,
全字和部分字
}  
...
静态字典_words=新字典();
静态字典_found=新字典();
无效搜索(字符[,]数组,整数i,整数a,整数宽度,整数高度,字符串构建,布尔[,]覆盖)
{            
如果(i>=宽度| | i<0 | | a>=高度| | a<0)
{
返回;
}            
如果(包括[a,i])
{
返回;
}
字符字母=数组[a,i];
字符串传递=构建+字母;
字型值;
if(_words.TryGetValue(通过,输出值))
{                
if(value==WordType.FullWord||
value==WordType.fullword和partialword)
{                    
如果(!\u找到。容器(通过))
{                        
_找到。添加(通过,正确);
}
}
if(值==WordType.PartialWord||
value==WordType.fullword和partialword)
{
bool[,]cov=新bool[高度,宽度];
对于(int i2=0;i2
当我叫它的时候:

 for (int i = 0; i < width; i++)
            {
                for (int a = 0; a < height; a++)
                {
                    Search(array, i, a, width, height, "", covered);
                }
            }
for(int i=0;i

如何避免异常?

查看“尾部递归”当您单步执行时,为什么要调用Search(数组、I+1、a、width、height、pass、cov)和其他7个方法内有+1和-1的调用,并在方法外抛出一个数组作为I和a?只保留另一个调用并删除其中的8个调用难道还不够吗?@kostyan:对于c#,“尾部递归”并不能保证在所有的体系结构上都适用。上次我看的时候,只有x64.net试过。什么样的文字搜索可以让你在第二个字母后向任何方向搜索?搜索结果会让整个董事会感到困惑。这就是你的意思吗?@spender是的,这就是我想做的。