o******1 发帖数: 1046 | 1 有n个数列An,n不确定,比如
A1 = {a, b, c...}
A2 = {2, 5...}
A3 = {+, -, *, %...}
.
.
.
要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b,
5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元
素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
如果n是个确定的数,用多重循环就行了。但是n是在run-time确定的。这样的话,程序
如何写比较好呢? | I*****y 发帖数: 602 | 2 递归?
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
| N******K 发帖数: 10202 | 3 用进位法
N=[n4 n3 n2 n1] 比如 N=1234
for N=N+1
检查进位
每进一位 就是新的循环
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
| x***4 发帖数: 1815 | 4 用stack?
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
| g*********e 发帖数: 14401 | | w******p 发帖数: 166 | 6 simple way is to use eval, ex. in python:
>>> A
[['a', 'b', 'c'], [2, 5], ['+', '-', '*', '%']]
>>> perm='[(' + ','.join("x"+str(i) for i in range(len(A))) + ')' + ''.join(
" for x"+str(i)+" in A["+str(i)+"]" for i in range(len(A))) + ']'
>>> perm
'[(x0,x1,x2) for x0 in A[0] for x1 in A[1] for x2 in A[2]]'
>>> eval(perm)
[('a', 2, '+'), ('a', 2, '-'), ('a', 2, '*'), ('a', 2, '%'), ('a', 5, '+'),
('a', 5, '-'), ('a', 5, '*'), ('a', 5, '%'), ('b', 2, '+'), ('b', 2, '-'), (
'b', 2, '*'), ('b', 2, '%'), ('b', 5, '+'), ('b', 5, '-'), ('b', 5, '*'), ('
b', 5, '%'), ('c', 2, '+'), ('c', 2, '-'), ('c', 2, '*'), ('c', 2, '%'), ('c
', 5, '+'), ('c', 5, '-'), ('c', 5, '*'), ('c', 5, '%')]
Actually in python it's even simpler:
>>> import itertools
>>> for i in itertools.product(*A): print i
('a', 2, '+')
('a', 2, '-')
('a', 2, '*')
('a', 2, '%')
('a', 5, '+')
('a', 5, '-')
...
An earlier version of itertools.product is implemented like this:
result = set()
for (rank = 0; rank < N; rank++) {
next = set()
for (i in A[rank]) { for r in result {
next.add(r, i) }}
result = next;
} | p*****2 发帖数: 21240 | 7 n= A1.length*B1.length*C1.length
然后循环就可以了吧? | b*******s 发帖数: 5216 | 8 see permutation algorithms
so easy
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
| d******e 发帖数: 2265 | 9 foldl
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
| d******e 发帖数: 2265 | 10 let a1 = ['a','b','c']
let a2 = ['2', '5']
let a3 = ['+', '-', '*', '/']
let cartProd xs ys = [ y: x | x <- xs, y <- ys]
foldl (cartProd) a' [a2, a3]
["+2a","-2a","*2a","/2a","+5a","-5a","*5a","/5a","+2b","-2b","*2b","/2b","+
5b","-5b","*5b","/5b","+2c","-2c","*2c","/2c","+5c","-5c","*5c","/5c"] | | | w*********a 发帖数: 9279 | 11 原理上就是一个while loop, 然后用逻辑表达退出条件。 | m*****k 发帖数: 731 | 12 int[] result = {1};
for (int[] a : An){
result=cartProd(result , a);
}
return result;
不可以吗? | h*****n 发帖数: 209 | | A*****i 发帖数: 3587 | | c*********e 发帖数: 16335 | 15 所有数列放在一个list,collection之类的结构里面,比如collection
然后就是for loop,
foreach (item in collection- ) {}
,
【在 o******1 的大作中提到】 : 有n个数列An,n不确定,比如 : A1 = {a, b, c...} : A2 = {2, 5...} : A3 = {+, -, *, %...} : . : . : . : 要找出{An}的直乘空间的所有元素(组合就行,不用排列),比如{a, 2, +...}, {b, : 5, *}等等。用上面的例子,如果只有3个数列,第一个数列3个元素,第二个数列2个元 : 素,第三个数列4个元素,就是要找出所有的3 x 2 x 4 = 24个直乘空间的元素。
|
|