2011-08-20 74 views
2

基本上,我的程序將嘗試生成所有可能的小寫5個字母的單詞列表。包括明顯不是真實單詞的所有組合,如jshccmmdzq控制堆棧溢出的技巧?

我這樣做是通過堆疊大量的函數調用來完成單詞工作。

但是,這太簡單了,我得到一個堆棧溢出錯誤。

某人會如何控制它?

+1

更改您的遞歸實現爲一個迭代。 –

+0

即使在一個最天真的實現中,你的堆棧也不應該大於5.你有一個遞歸錯誤。 –

回答

5

基本上,從遞歸轉換爲迭代。通常涉及創建一個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 - 再加上列表的所有空間等。這不應該殺死適合大機器,但它相當多的內存。你確定你需要所有這些嗎?

0

作爲一個簡單的解決方案,我會用多個循環迭代法,以產生這樣的話:

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)