如何避免递归
本文关键字:递归 何避免 | 更新日期: 2023-09-27 18:31:44
我正在开发一个使用递归的应用程序。
void Keres(char[,] array, int width, int height)
{
_found = Search(array, height, width, _words);
if (_found.Count < 6)
{
_found.Clear();
Keres(array, width, height);
}
}
搜索是一种递归方法,它返回一个字符串 List。我需要它的计数大于 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;
}
你的代码不是一个正确的递归,实际上你总是在调用相同的方法,每次调用递归方法时,一定有什么东西被改变了,显然在你的代码中你永远不会退出该方法,应用程序冻结。
我想,如果我理解你想要什么,你面临的问题就不能用递归来解决。
也许数组是会改变的东西,直到更改为>6,您想使用 Keres 方法检查?那么递归就不是这样做的方法。
您可以通过一个简单的循环来避免递归:
void Keres(char[,] array, int width, int height)
{
do
{
_found = Search(array,height,width,_words);
} while (_found.Count < 6)
}
但是,如果应用程序使用递归冻结,则可能会在没有它的情况下冻结,因为它们应该做同样的事情(此方法可以避免StackOverflow Exception
但是,如果这需要多次迭代才能完成)