n个数字的所有排列深度第一种方式

问题描述:

如何在一组n数字中包含m个元素并使用替换和订购事项来生成所有排列(订单事项)?n个数字的所有排列深度第一种方式

我不想使用更多的内存,只要我生成组合,我想使用它。

+0

(2,2,1)和(1,2,2)应该是g enerated? (订单是否重要)? – amit

+0

是的。订单很重要。 –

首先,请注意,如果订单很重要并且允许替换,您基本上有n选项可供选择每个元素(其中m) - 并且您拥有的选择量保持不变。

这意味着您有n*n*...*n = n^m可能的组合。

生成它们,你可以使用递归:

Python代码:(如果你不知道蟒蛇,就像它读成伪代码,这是很清楚)。

def generateAll(numbers, m, currentPermutation=[]): 
    if m == 0: 
     doSomething(currentPermutation) 
     return 
    for x in numbers: 
     currentPermutation.append(x) 
     generateAll(numbers, m-1, currentPermutation) 
     currentPermutation.pop() 

例如,如果我们定义

def doSomething(l): 
    print str(l) 

并运行

generateAll([1,2,3], 4) 

输出将打印所有组合与repalcements,其中顺序的事项,从大小为4 [1,2, 3]:

[1, 1, 1, 1] 
[1, 1, 1, 2] 
[1, 1, 1, 3] 
[1, 1, 2, 1] 
[1, 1, 2, 2] 
[1, 1, 2, 3] 
[1, 1, 3, 1] 
[1, 1, 3, 2] 
[1, 1, 3, 3] 
[1, 2, 1, 1] 
[1, 2, 1, 2] 
[1, 2, 1, 3] 
[1, 2, 2, 1] 
[1, 2, 2, 2] 
[1, 2, 2, 3] 
[1, 2, 3, 1] 
[1, 2, 3, 2] 
[1, 2, 3, 3] 
[1, 3, 1, 1] 
[1, 3, 1, 2] 
[1, 3, 1, 3] 
[1, 3, 2, 1] 
[1, 3, 2, 2] 
[1, 3, 2, 3] 
[1, 3, 3, 1] 
[1, 3, 3, 2] 
[1, 3, 3, 3] 
[2, 1, 1, 1] 
[2, 1, 1, 2] 
[2, 1, 1, 3] 
[2, 1, 2, 1] 
[2, 1, 2, 2] 
[2, 1, 2, 3] 
[2, 1, 3, 1] 
[2, 1, 3, 2] 
[2, 1, 3, 3] 
[2, 2, 1, 1] 
[2, 2, 1, 2] 
[2, 2, 1, 3] 
[2, 2, 2, 1] 
[2, 2, 2, 2] 
[2, 2, 2, 3] 
[2, 2, 3, 1] 
[2, 2, 3, 2] 
[2, 2, 3, 3] 
[2, 3, 1, 1] 
[2, 3, 1, 2] 
[2, 3, 1, 3] 
[2, 3, 2, 1] 
[2, 3, 2, 2] 
[2, 3, 2, 3] 
[2, 3, 3, 1] 
[2, 3, 3, 2] 
[2, 3, 3, 3] 
[3, 1, 1, 1] 
[3, 1, 1, 2] 
[3, 1, 1, 3] 
[3, 1, 2, 1] 
[3, 1, 2, 2] 
[3, 1, 2, 3] 
[3, 1, 3, 1] 
[3, 1, 3, 2] 
[3, 1, 3, 3] 
[3, 2, 1, 1] 
[3, 2, 1, 2] 
[3, 2, 1, 3] 
[3, 2, 2, 1] 
[3, 2, 2, 2] 
[3, 2, 2, 3] 
[3, 2, 3, 1] 
[3, 2, 3, 2] 
[3, 2, 3, 3] 
[3, 3, 1, 1] 
[3, 3, 1, 2] 
[3, 3, 1, 3] 
[3, 3, 2, 1] 
[3, 3, 2, 2] 
[3, 3, 2, 3] 
[3, 3, 3, 1] 
[3, 3, 3, 2] 
[3, 3, 3, 3]