基本上,我的程序將嘗試生成所有可能的小寫5個字母的單詞列表。包括明顯不是真實單詞的所有組合,如jshcc或mmdzq。控制堆棧溢出的技巧?
我這樣做是通過堆疊大量的函數調用來完成單詞工作。
但是,這太簡單了,我得到一個堆棧溢出錯誤。
某人會如何控制它?
基本上,我的程序將嘗試生成所有可能的小寫5個字母的單詞列表。包括明顯不是真實單詞的所有組合,如jshcc或mmdzq。控制堆棧溢出的技巧?
我這樣做是通過堆疊大量的函數調用來完成單詞工作。
但是,這太簡單了,我得到一個堆棧溢出錯誤。
某人會如何控制它?
基本上,從遞歸轉換爲迭代。通常涉及創建一個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上)大約爲285MB - 再加上列表的所有空間等。這不應該殺死適合大機器,但它是相當多的內存。你確定你需要所有這些嗎?
作爲一個簡單的解決方案,我會用多個循環迭代法,以產生這樣的話:
Dim words As New List(Of String)
Dim first As Integer = Asc("a")
Dim last As Integer = Asc("z")
For one As Integer = first To last
For two As Integer = first To last
For three As Integer = first To last
For four As Integer = first To last
For five As Integer = first To last
words.Add(Chr(one) & Chr(two) & Chr(three) & Chr(four) & Chr(five))
Next
Next
Next
Next
Next
MsgBox(words.Count)
更改您的遞歸實現爲一個迭代。 –
即使在一個最天真的實現中,你的堆棧也不應該大於5.你有一個遞歸錯誤。 –