有M个盒子 每个盒子中有不同数量的球
从每个盒子中各取一个球的组合数量很容易算出: M个盒子中球数量的连乘积
例如 有4个盒子 盒子中球的数目分别是 3个 2个 2个 4个
组合的数量为 3*2*2*4 = 48种
如果需要遍历这么多的组合 这个算法应该是怎样的呢?
将4个盒子视为(4,x)的不定长二维数组
最简单的方法是用一个4重的循环 每个循环代表每个一维数组的下标 由外到内 分别是 (0,3] (0,2] (0,2] (0,4] 的循环
像这样:
#!C:\Python33\python.exe
# Filename: traversal.py
data = ((0,1,2),\
(0,1),\
(0,1),\
(0,1,2,3),\
) #数据
for i in data[0]:
for j in data[1]:
for k in data[2]:
for l in data[3]:
print(i,j,k,l);
但是如果盒子的数目是个变量 那岂不是循环的重数也就不定了?
该怎么办?
把每个盒子看成一个"位" 而盒子的下标看成此位上的数值
例如 第一个盒子取的球号码是2 第二个盒子的球号码是0 ... 1 ...3 以此类推
可以表示为:数字2013
这样就可以将一个组合理解成一种奇怪的复合进制
最低位是4进制 第2位2进制 第3位2进制 最高位3进制
这样我们就可以用一个自增的变量来确定每个组合 而不用考虑实际意义
而在实际确定每个盒子取得是几的时候 只需要像类似于十进制取各个位上的值一样 求余处理即可
Python示例如下:
#!C:\Python33\python.exe
# Filename: traversal.py
data = ((0,1,2),\
(0,1),\
(0,1),\
(0,1,2,3),\
) #数据
# indexes = [] # 指针数组 存储被选中元素的ID
lengths = [] # 数据各个子数组的长度
totalLength = 1;
for row in data:
length = len(row)
# indexes.append(-1)
lengths.append(length)
totalLength *= length;
pass
for i in range(totalLength):
j = 0
for len in lengths:
print(data[j][i % len],end=' ')
# indexes[j] = i % len
i = int(i / len)
j += 1
pass
print();
# print(indexes);
pass