python编程题——如何求一组数的全排列

全排列就是把n个数按任意顺序进行排列,直到包含所有情况。按排列组合的知识来讲,情形共有n!种。

例:[1,2,3]

全排列:[1,2,3],[1,3,2],[2,1,3]

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

也就是共有3!=6种。

对于如何求一组数的排列,方法有很多,常用的有递归,深度优先搜索,广度优先搜索,但是在没有一定基础知识的情况下,想要理解这些知识还是比较困难的,设计出程序更是困难。

所以在下面的求解方法中,忽略上面的方法,以一种全新的方法来实现这个求解程序,一看便懂。

具体来讲,过程如下:

对于[1,2,3]这个例子,我们的算法是这样的。首先,是针对[1],此时,我们该把2加入,显然可以有两种方式,一种是插入到1之前,另一种是插入到1之后,也就是插空,得到[1,2],[2,1],同理,下面插入3,显然,对于[1,2],有三个空,把3分别插入,也就得到三种,对于[2,1],也有三个空,把3分别插入,也得到三种。当然,这两大种情况一定不会重复,因为1和2的位置(先后顺序)是不同的。这样我们得到了由一个元素,两个元素,三个元素分别形成的全排列。我们取最后一个结果即可,也就是由所有元素形成的全排列。

最后结果

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

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

代码实现:

def permute(nums):        length=len(nums)        result=[[[nums[0]]]]        if length==1:            return result[0]        else:            for i in range(1,length): #循环lengh-1次,也就是算到所有元素加入。                result.append(list()) #加入一个新列表,用于存储加入一个新元素后生成的全排列                for j in result[i-1]: #遍历上一个全排列                    for k in range(len(j)+1): #循环len(j)+1次,也就是可插入新元素的位置为len(j)+1个                         j.insert(k,nums[i])   #以上一个排列为基础,插入新元素                                                result[i].append(list(j))   #将得到的新的排列插入到新生成的列表中。                        j.pop(k)                  #弹出插入的元素,使上一个全排列的内容恢复到原来状态。                        return result[length-1]
res=permute([1,2,3])print(res)

结果:

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

当然,为了更好理解python的程序机制,下面给出一种上述程序的另一种代码,只有略小改动

代码:

def permute(nums):        length=len(nums)        result=[[[nums[0]]]]        if length==1:            return result[0]        else:            for i in range(1,length): #循环lengh-1次,也就是算到所有元素加入。                result.append(list()) #加入一个新列表,用于存储加入一个新元素后生成的全排列                for j in result[i-1]: #遍历上一个全排列                    for k in range(len(j)+1): #循环len(j)+1次,也就是可插入新元素的位置为len(j)+1个                         j.insert(k,nums[i])   #以上一个排列为基础,插入新元素                                                result[i].append(j)   #将得到的新的排列插入到新生成的列表中。                        j.pop(k)                  #弹出插入的元素,使上一个全排列的内容恢复到原来状态。                        return result[length-1]
res=permute([1,2,3])print(res)

事实上,这个程序仅仅把list(j)中的list去掉了,但是list(j)和j此时内容是完全相同的。但是最后输出结果是错误的。

list()是将输入内容转换为列表。如果输入内容就是列表,则不会有内容形式的变化。

如下:

​​​​​​​

>>> a=[1,2,3,4]>>> b=list(a)>>> b[1, 2, 3, 4]

请问问题到底出在哪???期待你的回答!

你可能感兴趣的:(数学和算法,python,开发语言,算法)