c#使用递归打印字符串数组的所有子集

时间:2013-10-24 12:25:16

标签: c# recursion

所以我有这个数组:

string[] words = {'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 - (测试摇滚),(测试乐趣),(摇滚乐)

等。

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

编辑:

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

添加循环到主方法

 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);              
            }

1 个答案:

答案 0 :(得分:3)

你可以在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());
}