Python中用递归的思想求ABCDE的全排列

Python09

Python中用递归的思想求ABCDE的全排列,第1张

def p(s,res=[]):

    #将字符c插入到数列ar中,会有多少种排列

    def h(c,ar):

        return [ar[:i]+[c]+ar[i:] for i in range(len(ar)+1)]

    #已有结果arr的基础上,如果增加c字符,arr会变成多少种排列

    def g(c,arr,res=[]):

        if arr==res==[]:

            return [[c]]

        elif arr==[]:

            return res

        else:

            return g(c,arr[1:],res+h(c,arr[0]))

    #主体递归

    if s=='':

        return res

    else:

        return p(s[1:],g(s[0],res))

if __name__=='__main__':

    s='ABCDE'

    for x in p(s):

        print(''.join(x))

更多精彩内容,请关注 【力扣中等题】 。

难度:★★★☆☆

类型:数学

方法:回溯法

给定一个没有重复数字的序列,返回其所有可能的全排列。

输入: [1,2,3]

输出:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

全排列其实可以使用python内置的permutations函数,例如求['a', 'b', 'c']的全排列,可以使用:itertools.permutations(['a', 'b', 'c'],3)快速得到。这里参考了 大佬博客 。

我们举个例子,以字符串列表['a', 'b', 'c']为例,我们逐个位确定全排列的所有可能。回溯法的原理在于在前n-1位元素确定的情况下,求取n位以后的全排列。本例中,首先固定第0位,就是分别将第0位与它本身及后面各位元素交换,得到3种不同的可能,在固定这一位后,在考虑第1位的可能性,将第1位与它本身及其后元素交换,有两种可能性,当前两位元素确定后,最后一位只有一种可能性。因此一共有6种可能。

这里需要注意的是,每次交换元素并回溯寻找后,都要将元素交换回来,保持没有交换前的状态。

与回溯法类似,增加临时列表用来存储是否查看过变量。

如有疑问或建议,欢迎评论区留言~

一、使用递归的背景

先来看一个☝️接口结构:

这个孩子,他是一个列表,下面有6个元素

展开children下第一个元素[0]看看:

发现[0]除了包含一些字段信息,还包含了 children 这个字段(喜当爹),同时这个children下包含了2个元素:

展开他的第一个元素,不出所料,也含有children字段(人均有娃)

可以理解为children是个对象,他包含了一些属性,特别的是其中有一个属性与父级children是一模一样的,他包含父级children所有的属性。

比如每个children都包含了一个name字段,我们要拿到所有children里name字段的值,这时候就要用到递归啦~

二、find_children.py

拆分理解:

1.首先import requests库,用它请求并获取接口返回的数据

2.若children以上还有很多层级,可以缩小数据范围,定位到children的上一层级

3.来看看定义的函数

我们的函数调用:find_children(node_f, 'children')

其中,node_f:json字段

    children:递归对象

 以下这段是实现递归的核心:

   if items['children']:

 items['children']不为None,表示该元素下的children字段还有子类数据值,此时满足if条件,可理解为 if 1。

 items['children']为None,表示该元素下children值为None,没有后续可递归值,此时不满足if条件,可理解为 if 0,不会再执行if下的语句(不会再递归)。

至此,每一层级中children的name以及下一层级children的name就都取出来了

希望到这里能帮助大家理解递归的思路,以后根据这个模板直接套用就行

(晚安啦~)

源码参考: https://www.coder4.com/archives/5767