1

我正在开发一个使用递归的应用程序。

void Keres(char[,] array, int width, int height)
{
    _found = Search(array, height, width, _words);

    if (_found.Count < 6)
    {
        _found.Clear();
        Keres(array, width, height);
    }
}

搜索是一种递归方法,它返回一个字符串列表。而且我需要它的计数大于 5。但如果不是,我必须一次又一次地调用 Keres 方法,直到它的计数为 6 或更大,但我的应用程序冻结了。

这里是我调用 Keres 方法的地方:

if ((string)appSettings["gamelanguage"] == "english")
                {
                    szo = EngInput(3, 3); //szo is a char[,] array
                    Keres(szo, 3, 3);
                }

我能做些什么来避免递归,或者避免崩溃,并得到我的> 6个项目?

编辑:搜索方法

List<string> Search(char[,] letter_table, int height, int width, List<string> words_list)
{
    List<string> possible_words = new List<string>();
    char[,] _tmp_letter_table = _tmp_letter_table = new char[height, width];
    bool possible = false;

    foreach (String word in words_list)
    {
        possible = false;
        Array.Copy(letter_table, _tmp_letter_table, width * height);
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                if (_tmp_letter_table[i, j] == word[0])
                {
                    if (IsNeighborTest(word, i, j, height, width, _tmp_letter_table, 0) == true)
                    {
                        possible = true;
                        break;
                    }
                    else
                    {
                        Array.Copy(letter_table, _tmp_letter_table, width * height);
                    }
                }
            }

            if (possible == true)
            {
                possible_words.Add(word);
                break;
            }
        }
    }
    return possible_words;
}
4

2 回答 2

2

您可以通过一个简单的循环来避免递归:

void Keres(char[,] array, int width, int height)
{
    do 
    {
        _found = Search(array,height,width,_words);
    } while (_found.Count < 6)
}

但是如果应用程序因递归而冻结,它可能会在没有它的情况下冻结,因为它们应该做同样的事情(StackOverflow Exception但是,如果这需要多次迭代才能完成,这种方法可能会避免)

于 2013-09-16T23:34:51.270 回答
2

您的代码不是正确的递归,实际上您总是调用相同的方法,每次调用递归方法时都必须更改某些内容,显然在您的代码中您永远不会退出该方法并且应用程序会冻结。

我认为,如果我了解您想要什么,那么您面临的问题无法通过递归解决。

也许数组会发生变化,直到更改为 >6 您想用 Keres 方法检查?然后递归不是这样做的方法。

于 2013-09-16T23:35:46.763 回答