问题描述
- 利用python来实现N个元素的全排列。
- 利用一个list来存储元素
- 这里考虑的是无重复元素的全排列
代码实现
- 实际上,可以将查找一个全排列的过程看成是一棵N(N表示list的长度)叉树的深度优先遍历。当到达最大深度时候就往后退一步(相当于回溯一步)
- 每次取一个元素之后,就可以进行递归。每个元素都可以当成树的根节点。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author : Sword
@Date : 2020/6/3
@Time : 下午 13:55
@Version : v1.0
@File : full_rank.py
@Describe :全排列
"""
class NoDuplicateElement(object):
"""
无重复元素的全排列
"""
def get_full_resolution(self, store, temp_list, test_list):
# 递归停止条件
# temp_list用来存储一种完整的全排列
# 如果长度已经和原始的输入test_list相等,则将这一种全排列存储下来
# 继续找下一种全排列
if len(temp_list) == len(test_list):
store.append(temp_list[:])
else:
# 遍历原始输入中的元素,每次取出一个元素
for i in test_list:
if i in temp_list:
continue
# 如果当前遍历到的点不在temp_list中
# 则添加到该列表中
temp_list.append(i)
# 添加完一个点之后,剩下的过程其实可以看成同样的过程
self.get_full_resolution(store, temp_list, test_list)
# 当找到一种全排列之后,就删掉一个点(往后退一步),继续判断其它的情况
temp_list.pop()
def backtrack(self, test_list):
store = []
temp_list = []
self.get_full_resolution(store, temp_list, test_list)
return store
if __name__ == '__main__':
test_list = [1, 2, 3, 4]
c = NoDuplicateElement()
result = c.backtrack(test_list)
for i in result:
print(i)
print('总共{}种全排列'.format(len(result)))