我正在尝试用C ++或C#
做一些算法基本上如果你有一个数组:
{"ab","cd"}
输出:
ac
ad
bc
bd
(我有两个嵌套for循环)
但如果我有一个包含3个元素的数组怎么办?还是4?
谢谢你们:)
答案 0 :(得分:4)
您正在寻找任意多个字符序列的笛卡尔积。请参阅此博客文章:
http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
和这个StackOverflow问题,你已经重复了。
答案 1 :(得分:2)
为了改变“嵌套循环”的数量,你需要使用递归。
void printCombination(string[] str, string partial, int p) {
if (p == str.Length) {
Console.WriteLine(partial);
return;
}
for (int i = 0 ; i != str[p].Length; i++) {
printCombination(str, partial + str[p][i], p+1);
}
}
初始通话如下:
printCombination(new[] {"ab", "cd", "ef", "gh"}, "", 0);
编辑(回应OP的评论)
要了解发生了什么,首先需要了解参数的含义:
str
是字符串数组。数组的每个元素对应于虚构嵌套循环的嵌套级别:元素0用于外部循环,元素1用于第一级嵌套,依此类推。partial
是部分构造的结果字符串。它在初始级别为空,在第一级嵌套时有一个字符,在第二级有两个,依此类推。p
是嵌套级别。它在初始级别为零,在第一个嵌套级别为1,依此类推。该函数有两个部分 - 停止条件和递归调用的主体。停止条件很简单:一旦我们到达最后一级,partial
结果不再是“部分”:它是完整的;我们可以把它打印出来然后退出。我们怎么知道我们处于最后一级? str
的元素数量等于级别数,因此当p
等于str
数组的长度时,我们就完成了。
递归调用的主体是一个循环。它与嵌套循环的作用相同,但只有一个级别:每次迭代都会从自己的数组中添加一个字母,并递归调用自己的下一级别。
查看此操作的最佳方法是使用return
语句在行上设置断点,然后查看调用堆栈窗口。单击每个调用级别,并检查函数参数的值。
如果您正在练习,请尝试修改此功能以获取两个参数而不是三个参数。提示:您可以通过观察partial
的长度始终与p
的值匹配来消除最后一个参数。
答案 2 :(得分:0)
在c ++中有一种名为std::next_permutation
的算法。这是一个例子,希望这对你有帮助。
#include <algorithm>
#include <string>
#include <iostream>
int main()
{
std::string s = "aba";
std::sort(s.begin(), s.end());
do {
std::cout << s << '\n';
} while(std::next_permutation(s.begin(), s.end()));
}
Output:
aab
aba
baa
答案 3 :(得分:0)
然后你不能使用嵌套的for循环,因为你不能以编程方式改变它。
在这种情况下,为每个元素使用一个计数器,这是您正在迭代的当前元素。 使用while循环和函数来检查是否已完成。
增加第一个元素的计数器,如果它已达到最大值,则将其设置为0并增加下一个计数器等。
(编辑:使用排列的解决方案可能在内部使用我的解决方案。)