美文网首页
全排列,递归与分治

全排列,递归与分治

作者: walkerwzy | 来源:发表于2021-11-28 01:26 被阅读0次

能够用递归和分治解决的,特征都是下一级做的事跟上一级一样(抽象),最后一层做真正的业务。比如n个数字的全排列,抽象出来就是每n-1个数字的全排列

它的难点就在于抽象,因为等于什么都没描述(我要5个数字的全排列,你就说,那好,你告诉我这4个数字的全排列,我就能告诉你5个数字的全排列)。

也就是说,尝试用n和n-1的思维(有点像归纳法,动态规划)去描述问题,而不去看能不能解决。

具体到这里,以ABCD为例,我们的请求过程应该是这样的

  • A打头的话,BCD的全排列 swap(0, 0)
  • B打头的话,ACD的全排列 swap(0, 1)
  • ...swap(0,2)
  • ...swap(0,3)

自己是可以数出来的:

A固定,BCD的所有排列 swap(0,0)
  B固定,CD的所有排列 swap(1,1)
      C固定,D的所有排列 swap(1,2)(1)
      D固定,C的所有排列 swap(1,3)(1)
  C固定,同B(2)
  D固定,同B(2)
  计6种
B固定,同A,(6) swap(0,1)
C固定,同A,(6) swap(0,2)
D固定,同A,(6) swap(0,3)
结果应该是24

所有缩进部分都是递归,所以真正的业务代码就是一句话,交换每次比较的数组的第一个和剩下的几个的位置,然后递归下去

ctr = 0
def perm(arr, start=0, end=None):
    global ctr
    end = end or len(arr)

    if start == end:
        print(arr)
        ctr += 1
    else:
        for i in range(start, end):
            # 思路是,我每次只动一个数字,然后固定住这个数字,看剩下的数字有多少种排列
            # 代码里每次把固定的数字挪到开头
            arr[i], arr[start] = arr[start], arr[i]
            perm(arr, start+1, end)
            arr[i], arr[start] = arr[start], arr[i]

if __name__ == "__main__":
    arr = [1,2,3,4]
    perm(arr)
    print(ctr)

output: 24

可能是我理解能力的问题,所有人都没有解释为什么有swap,可能是太直观吧,毕竟swap才是真正在”排列“的业务代码。我还是自己写一遍才想明白,记录一下吧。

相关文章

  • 全排列,递归与分治

    能够用递归和分治解决的,特征都是下一级做的事跟上一级一样(抽象),最后一层做真正的业务。比如n个数字的全排列,抽象...

  • 分治法应用——全排列

    目录 什么是分治法?分析什么是全排列代码(c++)java实现递归结构展示 什么是分治法? 先看分:将一个大问题分...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 递归-全排列

    对数组{1,2,3}进行全排列 STL next_permutation

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • 全排列

    求全排列最简单的就是递归了123 的全排列共有 6 个, 123 的全排列等于以 1 开头 23 的全排列, 加上...

  • 关于数组的一些操作【python】

    递归的应用:求输入字符串的全排列 求输入字符串的全排列递归完成,也可以直接使用库函数 结果展示: ————————...

  • 全排列(数字重复与不重复)问题的递归与非递归代码

    全排列给定一个数字列表,返回其所有可能的排列。 样例给出一个列表[1,2,3],其全排列为: 递归代码 非递归代码...

  • 算法中的排列组合问题

    一、全排列: 算法: 递归: 先确定第一个元素,对后面的全排列; 将后面元素逐渐与第一个交换,然后...

网友评论

      本文标题:全排列,递归与分治

      本文链接:https://www.haomeiwen.com/subject/inlcxrtx.html