我让用户输入以下格式的字符串:
实施例1:A,B,C | 1,2,3 | A,B,C
实施例2:A,B | C,D | E | F,G
我想写出所有可能的组合,例如:
例如1的可能输出:
A,1,a A,2,a A,3,a
A,1,b A,2,b A,3,b
A,1,c A,2,c A,3,c ... and so on
例2的可能输出:
A,C,E,F B,C,E,F
A,C,E,G B,C,E,G
A,D,E,F B,D,E,F
A,D,E,G B,D,E,G ... and so on
我的问题是|
字符的数量不恒定,因此我不能只编写固定数量的嵌套for循环,我无法对此进行硬编码。
这些输入字符串实际上是命令的参数。最后,我不打算在控制台上输出这些组合。我想发送看起来像的命令:命令A 1 a,命令A 1 b等等
我不是要为我复制和粘贴代码。我无法得到我遇到的这个问题背后的算法。
我尝试了很多不同的for循环,但没有任何效果,我觉得我的方法从解决方案中得到了进一步的发展,所以我只需要有人指出我正确的方向让我理解这个概念在一天结束时,我仍然需要自己编写代码才能得到我想要的东西。
答案 0 :(得分:0)
递归可以帮到你。请考虑以下事项:
可以通过计算X, Y | ...
的解决方案,循环...
并将每个选项前置到X, Y
来计算...
的解决方案。因此,您可以使用一个循环和递归。
答案 1 :(得分:0)
写一个递归函数。
假设你有data[][]
来保存输入。有类似的东西:
solution[]
void printall(data[][], int level) {
if (level>data.size()) print solution;
for (c in data[level]) {
solution[level] = c;
printall(data, level +1);
}
}
答案 2 :(得分:0)
可以在没有递归的情况下完成。
var s = "A,B,C|1,2|a|u,v,w";
var u = s.Split('|').Select(v => v.Split(',')).ToList();
var buffer = new List<string>();
buffer.Add("COMMAND ");
while (u.Count > 0)
{
var t = from a in buffer
from b in u.First()
select a + ' ' + b;
buffer = t.ToList();
u.RemoveAt(0);
}
buffer
列表将包含之后的“递归外连接”组合字符串。
答案 3 :(得分:-1)
var input = "A,B,C | 1,2,3 | a,b,c".Replace(' ','');
var groups = input.split('|');
var a = groups[0].split(",");
var b = groups[1].split(",");
var c = groups[2].split(",");
foreach(var x int a)
foreach(var y in b)
foreach(var z in c)
{
Console.WriteLine(x+y+z);
}