所以我有这个数组:
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);
}
答案 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());
}