python实现全排列(递归和循环)

递归实现全排列可以使用回溯法。具体步骤如下:

  1. 将待排列的元素分为两部分:第一个元素(固定元素)和其余元素。
  2. 对于固定元素后面的每一个元素,将其与固定元素交换位置,然后递归地对剩余元素进行全排列。
  3. 递归的终止条件是固定元素后面没有剩余元素,即只有一个元素时,直接返回该元素的排列。

以下是使用递归实现全排列的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 output

nums = [1, 2, 3]
print(permute(nums))

循环实现全排列可以使用交换法。具体步骤如下:

  1. 初始化一个指针数组,用来记录每个位置应该放置的元素的下标。
  2. 当指针数组的最后一个元素达到最大值时,表示排列已经完成,则输出当前排列。
  3. 从最后一个位置开始,找到第一个小于最大值的元素下标,将其值加1,然后将其后面的元素依次递增填充。
  4. 重复步骤2和步骤3,直到指针数组的第一个元素达到最大值。

以下是使用循环实现全排列的Python代码:

def permute(nums):
    n = len(nums)
    output = []
    indexes = [0] * n
    i = 0
    while 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] += 1
            i = 0
        else:
            indexes[i] = 0
            i += 1
    return output

nums = [1, 2, 3]
print(permute(nums))

以上两种方法都可以实现全排列,递归方法比较直观,但是在计算效率上较低,因为会生成很多中间结果;循环方法的计算效率较高,但是需要对数组进行操作,有一定的复杂性。具体使用哪种方法取决于实际需求和数据规模。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值