全排列dfs

思想简介:

递归:递归,就是在运行的过程中调用自己,构成递归需具备的条件

dfs 深搜:简单来说就是一条路走到底, 走不通时回退,看有没有路可走

递归调用自己层层深入 而dfs在有路可走时也是层层深入

可见两者实现过程有类似的点


递归的回退:

递归的进入很简单大家都能理解,但是递归的回退是在计算机底层执行的,我们无法看到。因此,递归究竟是如何完成的,成为了理解递归的一个难点。

我们先来看一个例子

int n = 3;

void func(int u)
{
    if(u == 0) return;
    cout << "Recursive program goes to the next level --- " << u << endl;
    func(u-1);
    cout << "Recursive program backtracking --- " << u <

n == 3 时 输出为:

Recursive program goes to the next level --- 3
Recursive program goes to the next level --- 2
Recursive program goes to the next level --- 1
Recursive program backtracking --- 1
Recursive program backtracking --- 2
Recursive program backtracking --- 3

输出前三行 相信大家都理解,

那么后三行呢 为什么输出顺序就是1 2 3   ?

从图中我们可以清晰的看出来输出产生的全过程

全排列dfs_第1张图片

dfs全排列:

问题简述:输入一个数 n 按字典序输出全排列

我们重点分析用 dfs 算法时的具体流程是怎样的

AC代码(以 n == 3 为例)

void dfs(int x)// x表示现在在第几个位置上
{
	if(x == n + 1)// 站在第n + 1个位置时,表示前n个位置已经填好
	{
		for(int i = 1; i <= n; i++)
			cout<< a[i] <<" ";
		cout<

得到输出为:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

分析过程前 我们应该知道一个小常识

计算机运行函数时,为每一位子函数都分配了一片栈空间,专门用于存储每一层递归函数的信息

也就是说,每层函数的各个局部变量的值会被记忆存储起来

下面,我们手动模拟出部分答案 来看递归 进去 与 回退 的详细步骤

如果你和我一样是蒟蒻不理解递归的回退的话  手写部分应该有很大帮助

如果对你有帮助记得点赞o

 

你可能感兴趣的:(c++,深度优先,算法,c++,蓝桥杯)