'''
非递归实现
index表示生成index+1大小的临时数组作为子数组
index从1开始,到原始数组的长度
'''
if len(nums) <= 1:
return [nums]
result = [[nums[0]]]
index = 1
while index < len(nums): ###生成index+1大小的子数组,直到等于nums长度终止
tmp = []
for perm in result:#遍历每个子数组,每次循环子数组长度+1
for i in range(index + 1): #i从0到index,
tmp.append(perm[:i] + [nums[index]] + perm[i:])
print(perm[:i] + [nums[index]] + perm[i:],i,index)
result = tmp
index += 1
return result
'''
python自带的itertools.permutations实现方法
首先记录123,固定1不动,然后交换2和3,得到132,记录132。
然后我们将2放到list前,得到213,记录213,然后交换1和3,得到231,记录231。
然后我们将3放到list前,得到312,记录312,然后交换1和2,得到321,记录321。
其实看不懂
'''
result = list()
n = len(nums)
indices = [i for i in range(n)]
cycles = [i for i in range(n, 0, -1)]
result.append([nums[i] for i in indices[:n]])
while n:
for i in reversed(range(n)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i + 1:] + indices[i:i + 1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
result.append([nums[i] for i in indices[:n]])
break
else:
print(result)
return result
def permute(self, nums):
'''
递归实现
1.递归条件
'''
n = len(nums)
if n == 0 or n == 1:
return [nums]
res = []
for i in range(n):
list_num = self.permute(nums[0:i]+(nums[i+1:]))
for j in list_num:
res.append([nums[i]]+j)
return res
参考https://blog.csdn.net/qq_17550379/article/details/82500364