2

所以我有这个数组:

string[] words = {'test', 'rock', 'fun'}

我必须打印所有子集,所以结果必须是

(), (test), (rock), (fun), (test rock), (test fun),(rock fun), (test rock fun)

到目前为止,这是我的代码

    static int x = 0;

    static void Main(string[] args)
    {
        string[] words = { "test", "rock", "fun" };
        string[] helperArray = new string[3];

        NestedLoops(words, helperArray, 0, 0);
    }

    static void NestedLoops(string[] words, string[] helperArray, int index, int start)
    {
        if (index == x)
        {
            PrintArray(helperArray);              
        }
        else
        {
            for (int i = start; i < 3; i++)
            {

                helperArray[index] = words[i];
                NestedLoops(words, helperArray, index + 1, i + 1);
            }
        }
    }
    static void PrintArray(string[] array)
    {
        Console.Write("(");
        for (int i = 0; i < 3; i++)
        {
            Console.Write(" {0}", array[i]);
        }
        Console.Write(")");
        Console.WriteLine();
    }

我只是不知道如何在循环结束时使 x 增加,现在我只得到这些结果

x = 0 - ()

x = 1 - (测试), (摇滚), (乐趣)

x = 2 - (测试摇滚), (测试乐趣),(摇滚乐趣)

ETC..

我是递归新手,所以如果问题很愚蠢,我很抱歉。

编辑:

我把它弄出来了,尽管它不是很优雅。

在 main 方法中添加了循环

 static void Main(string[] args)
        {
            string[] words = { "test", "rock", "fun" };
            string[] helperArray = new string[3];

            for (int i = 0; i <= 3; i++)
            {
                NestedLoops(words, helperArray, 0, 0, i);
            }

        }

并将变量 x 添加到嵌套循环递归中

static void NestedLoops(string[] words, string[] helperArray, int index, int start, int x)
        {
            if (index == x)
            {
                PrintArray(helperArray);              
            }
4

1 回答 1

4

在 linq 的帮助下,你可以很容易地做到这一点。我在这里给出一个示例代码。

public static IEnumerable<IEnumerable<string>> SubSetsOf(List<string> source)
{
    if (!source.Any())
        return Enumerable.Repeat(Enumerable.Empty<string>(), 1);

    var element = source.Take(1);

    var haveNots = SubSetsOf(source.Skip(1).ToList()).ToList();
    var haves = haveNots.Select(element.Concat);

    return haves.Concat(haveNots);
}

private static void Main(string[] args)
{
        string[] words = { "test", "rock", "fun" };
        var subSetsOf = SubSetsOf(words.ToList());
}
于 2013-10-24T12:49:47.553 回答