递归实现全排列可以使用回溯法。具体步骤如下:
- 将待排列的元素分为两部分:第一个元素(固定元素)和其余元素。
- 对于固定元素后面的每一个元素,将其与固定元素交换位置,然后递归地对剩余元素进行全排列。
- 递归的终止条件是固定元素后面没有剩余元素,即只有一个元素时,直接返回该元素的排列。
以下是使用递归实现全排列的Python代码:
def permute(nums):def backtrack(first=0):# 所有数都填完了if first == n:output.append(nums[:])for i in range(first, n):# 动态维护数组nums[first], nums[i] = nums[i], nums[first]# 继续递归填下一个数backtrack(first + 1)# 撤销操作nums[first], nums[i] = nums[i], nums[first]n = len(nums)output = []backtrack()return outputnums = [1, 2, 3]
print(permute(nums))
循环实现全排列可以使用交换法。具体步骤如下:
- 初始化一个指针数组,用来记录每个位置应该放置的元素的下标。
- 当指针数组的最后一个元素达到最大值时,表示排列已经完成,则输出当前排列。
- 从最后一个位置开始,找到第一个小于最大值的元素下标,将其值加1,然后将其后面的元素依次递增填充。
- 重复步骤2和步骤3,直到指针数组的第一个元素达到最大值。
以下是使用循环实现全排列的Python代码:
def permute(nums):n = len(nums)output = []indexes = [0] * ni = 0while i < n:if indexes[i] < i:output.append(nums[:])if i % 2 == 0:nums[0], nums[i] = nums[i], nums[0]else:nums[indexes[i]], nums[i] = nums[i], nums[indexes[i]]indexes[i] += 1i = 0else:indexes[i] = 0i += 1return outputnums = [1, 2, 3]
print(permute(nums))
以上两种方法都可以实现全排列,递归方法比较直观,但是在计算效率上较低,因为会生成很多中间结果;循环方法的计算效率较高,但是需要对数组进行操作,有一定的复杂性。具体使用哪种方法取决于实际需求和数据规模。