用递归法按故障阶数生成机组序列

最近开始用C++代替matlab编程了,其中涉及到了用递归法生成发电机故障组合;通俗点来讲就是在n个1当中有m个0(n>m),要生成所有可能的排列组合

例如:

1
2
3
4
5
6
7
8
9
10
11
5个发电机组,列出2阶故障的情况是(也就是31,20的组合):
00111
01011
01101
01110
10011
10101
10110
11001
11010
11100

多的不说直接贴C++代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
using namespace std;
int g_count;//定义机组个数
int list[100];
bool Findsame(int list[], int k, int m) //查找重复的
{
// list[m]是否有在list[k, m-1]出现过
for (int i = k; i < m; i++) {
if (list[m] == list[i]) {
// 出现了
return true;
}
}
return false;
}
void Perm(int list[], int k, int m)// 全排列,递归
{
if (k == m) // 输出排列
{
for (int i = 0; i <= m; i++)
cout << list[i];
cout << endl;
}
else{
for (int i = k; i <= m; i++) {
if (Findsame(list, k, i)) {
continue;//去除已出现过的排列
}
swap(list[k], list[i]);
Perm(list, k + 1, m);// 递归
swap(list[k], list[i]);
}
}
}
void order(int n)//n是几,就生成几阶故障的序列
{
for (int i = 0; i < g_count; i++)
list[i] = 1;
//生成0阶
for (int k = 0; k < g_count; k++)
cout << list[k];
cout << endl;
//大于0阶
for (int i = 0; i < n; i++)
{
list[i] = 0;
Perm(list, 0, g_count - 1);
}
}
int main()
{
g_count = 32;//机组个数
order(3);
return 0;
}

刚开始用递归,很是纠结,网上关于生成故障机组序列的资料也不多(可能是我不会找)。
这里我把代码贴出来,一是自己做一个记录,二是希望能够帮到有需要的人。