控制堆栈溢出的技术?

时间:2011-08-20 19:48:33

标签: vb.net stack-overflow

基本上,我的程序将尝试生成所有可能的小写5个字母单词的列表。包括明显不是真正的单词的所有组合,例如 jshcc mmdzq

我通过堆积大量的函数调用来实现这一点,这样就可以了。

但这太过分了,我收到了堆栈溢出错误。

有人会如何控制?

2 个答案:

答案 0 :(得分: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 - 加上列表的所有空间等。这不应该杀死一个适当的大机器,但它 相当多的内存。你确定你需要所有这些吗?

答案 1 :(得分: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)