В основном, конвертировать из рекурсии в итерацию.Как правило, это включает создание Stack<T>
в качестве «логического» стека или чего-то подобного.
Однако я бы ожидал, что метод, генерирующий список всех возможных 5-буквенных слов, будет иметь стек только около5 глубоких - по одному на каждую букву.Каждый уровень стека будет отвечать за один уровень буквы - так что «верх» стека будет перебирать каждую возможную последнюю букву;следующий кадр стека будет проходить через каждую возможную четвертую букву, вызывая метод рекурсивно для перебора всех возможных последних букв и т. д. Примерно так (код на C #, но, надеюсь, вы сможете понять его и применить к VB):
const string Letters = "abcdefghijklmnopqrstuvwxyz";
public static List<string> GenerateValidWords(int length)
{
List<string> words = new List<string>();
GenerateValidWords(0, new char[length], words);
return words;
}
private static void GenerateValidWords(int depth, char[] current,
List<string> words)
{
foreach (char letter in letters)
{
current[depth] = letter;
if (depth == current.Length - 1)
{
string word = new string(current);
if (IsValid(word))
{
words.Add(word);
}
}
else
{
GenerateValidWords(depth + 1, current, words);
}
}
}
Теперь, если у вас нет какой-либо фильтрации, это сгенерирует 11 881 376 слов - что при 24 байтах каждое (на x86) составляет около 285 МБ - плюс все пространство для списка и т. Д. Это не должноубить достаточно большую машину, но - это достаточно много памяти.Вы уверены, что вам все это нужно?