[DFS全排列]深入理解dfs的内外层

#找出begin到n中和为m的所有组合,存入path并且打印。从前到后的深搜顺序保证了输出是符合字典顺序的。
def dfs(begin,sum,path):
    if sum==0:#输出符合条件的path
        for i in range(len(path)):
            if i==len(path)-1:
                print(path[i],end='=')
                print(m)
            else:
                print(path[i], end='+')
        return
    for i in range(begin,n+1):
        if i<=sum:#剪枝
            path.append(i)
            dfs(i,sum-i,path)
            path.pop()
    return#这里表示这一级别的dfs函数已经结束了,返回上一级 dfs函数 


n,m=map(int,input().split())
path=[]
dfs(1,m,path)

1.第一层遍历以begin到n的所有值为起点,取值为i时就传入i,

第二层遍历以i到n的所有值为第二个值,

。。。。。。

2.注意,从第一层选择一个值i进入内部函数dfs时起,此对应的一个大循环并没有结束,直到内层dfs结束后才执行path.pop()语句,(最里面的dfs返回的是return,故当满足return的判断条件就是遍历的每一个大循环由内向外返回的转折点)

3.此时内层dfs同样也是如此,只不过越内层的dfs越早返回值,故path.pop()会从最后一次加入的值开始先pop掉最后一次的值,(需要注意的是此时已经满足了sum==0,故在此时输出此种情况的path)然后返回上一层,继续pop,直到最外层pop掉path中的最后一个值i,也是第一层加入的值。

4.此时path为空,再次进行for循环加入下一个初值i+1

5.函数中没有判断语句的程序,基本上在最内层向外层返回时都会运行一遍

6,在递归中,return的作用有两个,一个是返回值,另一个是终止循环程序,如果函数没有return则会返回None。

      注意这个 return 它的作用不是返回主函数,而是返回上一级的dfs函数 例:如果此时是 dfs(5),遇到这个 return 就会回到上一级的 dfs函数 也就是dfs(4),但此时dfs(4)的大部分语句已经执行了,只需要接着执行 book[i]=0 然后继续进入for循环进入下一次的 dfs函数,直到结束。

      第一个条件return是内循环的终点,第二给return是内循环回溯到上一循环的连线

DFS入门级(模板)_ღ江晚吟的博客-CSDN博客_dfs入门

你可能感兴趣的:(DFS,深度优先,算法,python)