[英]C# Dynamic for-loop
我让用户输入以下格式的字符串:
示例 1:A、B、C | 1,2,3 | 一、二、三
示例 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 循环,我不能对此进行硬编码。
这些输入字符串实际上是命令的参数。 最后,我不打算只在控制台上输出这些组合。 我想发送类似于:COMMAND A 1 a、COMMAND A 1 b 等的命令。
我不是在寻找让我复制和粘贴的代码。 我只是无法得到我遇到的这个问题背后的算法。
我尝试了很多不同的 for 循环,但没有任何效果,而且我觉得我的方法离解决方案越来越远,所以我只需要有人为我指出正确的方向,让我理解这个概念,并在最后那天我仍然必须编写自己的代码才能得到我想要的东西。
递归可以在这里帮助你。 考虑以下:
X, Y | ...
的解X, Y | ...
X, Y | ...
可以通过解计算要计算...
,循环过X, Y
和前面加上每个选项...
。 因此,您可以摆脱一个循环和一个递归。
写一个递归函数。
假设您有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);
}
}
它可以在没有递归的情况下完成。
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
列表之后将包含“递归外连接”组合字符串。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.